Don't define HAVE_DIMM_H if MSC, as you have to get the Platform SDK to
authorTor Lillqvist <tml@iki.fi>
Thu, 4 Nov 1999 23:42:51 +0000 (23:42 +0000)
committerTor Lillqvist <tml@src.gnome.org>
Thu, 4 Nov 1999 23:42:51 +0000 (23:42 +0000)
1999-11-04  Tor Lillqvist  <tml@iki.fi>

* config.h.win32: Don't define HAVE_DIMM_H if MSC, as you have to
get the Platform SDK to get <dimm.h>.

* gdk/win32/gdkevents.c: More event handling fixes and
simplification. Never generate motion events with is_hint true. We
used to do that on bogus grounds earlier. Windows sends
WM_MOUSEMOVE messages on button events even if the mouse hasn't
moved, ignore these.

* gdk/win32/gdkfont.c: Load all fonts as (pretended) fontsets.

* gdk/win32/gdkglobals.c
* gdk/win32/gdkprivate.h: Define a typedef for the pointer to
the TrackMouseEvent function, and use it.

* gdk/win32/gdkwindow.c: Terminate widechar string with a zero
char before calling WideCharToMultiByte in order to get a string
for the window title.

* gdk/win32/gdkdnd.c: Some more random hacking, ifdeffed out.

* gdk/win32/gdk.def: Remove obsolete functions.

* gdk/win32/makefile.{cygwin,msc}: Remove gdkcompat.{o,obj}. Add
/nodefaultlib and /defaultlib switches.

* gtk/gtkrc.c: s/gwin_getlocale/g_win32_getlocale/.

25 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
config.h.win32
gdk/win32/gdk-win32.def
gdk/win32/gdk.def
gdk/win32/gdkdnd-win32.c
gdk/win32/gdkdnd.c
gdk/win32/gdkevents-win32.c
gdk/win32/gdkevents.c
gdk/win32/gdkfont-win32.c
gdk/win32/gdkfont.c
gdk/win32/gdkglobals-win32.c
gdk/win32/gdkglobals.c
gdk/win32/gdkprivate-win32.h
gdk/win32/gdkprivate.h
gdk/win32/gdkwindow-win32.c
gdk/win32/gdkwindow.c
gdk/win32/makefile.cygwin
gdk/win32/makefile.msc
gtk/gtkrc.c

index 58777a85fc5b6aff67300308a8cdb0ca18573b75..608f6d7582204eec6e0dba17b7c7d082116a3f56 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,33 @@
+1999-11-04  Tor Lillqvist  <tml@iki.fi>
+
+       * config.h.win32: Don't define HAVE_DIMM_H if MSC, as you have to
+       get the Platform SDK to get <dimm.h>.
+
+       * gdk/win32/gdkevents.c: More event handling fixes and
+       simplification. Never generate motion events with is_hint true. We
+       used to do that on bogus grounds earlier. Windows sends
+       WM_MOUSEMOVE messages on button events even if the mouse hasn't
+       moved, ignore these.
+
+       * gdk/win32/gdkfont.c: Load all fonts as (pretended) fontsets.
+
+       * gdk/win32/gdkglobals.c
+       * gdk/win32/gdkprivate.h: Define a typedef for the pointer to
+       the TrackMouseEvent function, and use it.
+
+       * gdk/win32/gdkwindow.c: Terminate widechar string with a zero
+       char before calling WideCharToMultiByte in order to get a string
+       for the window title.
+
+       * gdk/win32/gdkdnd.c: Some more random hacking, ifdeffed out.
+
+       * gdk/win32/gdk.def: Remove obsolete functions.
+
+       * gdk/win32/makefile.{cygwin,msc}: Remove gdkcompat.{o,obj}. Add
+       /nodefaultlib and /defaultlib switches.
+
+       * gtk/gtkrc.c: s/gwin_getlocale/g_win32_getlocale/.
+
 1999-10-31  Tor Lillqvist  <tml@iki.fi>
 
        * gdk/gdkkeysyms.h: Add new keysyms from X11R6.4 (including
index 58777a85fc5b6aff67300308a8cdb0ca18573b75..608f6d7582204eec6e0dba17b7c7d082116a3f56 100644 (file)
@@ -1,3 +1,33 @@
+1999-11-04  Tor Lillqvist  <tml@iki.fi>
+
+       * config.h.win32: Don't define HAVE_DIMM_H if MSC, as you have to
+       get the Platform SDK to get <dimm.h>.
+
+       * gdk/win32/gdkevents.c: More event handling fixes and
+       simplification. Never generate motion events with is_hint true. We
+       used to do that on bogus grounds earlier. Windows sends
+       WM_MOUSEMOVE messages on button events even if the mouse hasn't
+       moved, ignore these.
+
+       * gdk/win32/gdkfont.c: Load all fonts as (pretended) fontsets.
+
+       * gdk/win32/gdkglobals.c
+       * gdk/win32/gdkprivate.h: Define a typedef for the pointer to
+       the TrackMouseEvent function, and use it.
+
+       * gdk/win32/gdkwindow.c: Terminate widechar string with a zero
+       char before calling WideCharToMultiByte in order to get a string
+       for the window title.
+
+       * gdk/win32/gdkdnd.c: Some more random hacking, ifdeffed out.
+
+       * gdk/win32/gdk.def: Remove obsolete functions.
+
+       * gdk/win32/makefile.{cygwin,msc}: Remove gdkcompat.{o,obj}. Add
+       /nodefaultlib and /defaultlib switches.
+
+       * gtk/gtkrc.c: s/gwin_getlocale/g_win32_getlocale/.
+
 1999-10-31  Tor Lillqvist  <tml@iki.fi>
 
        * gdk/gdkkeysyms.h: Add new keysyms from X11R6.4 (including
index 58777a85fc5b6aff67300308a8cdb0ca18573b75..608f6d7582204eec6e0dba17b7c7d082116a3f56 100644 (file)
@@ -1,3 +1,33 @@
+1999-11-04  Tor Lillqvist  <tml@iki.fi>
+
+       * config.h.win32: Don't define HAVE_DIMM_H if MSC, as you have to
+       get the Platform SDK to get <dimm.h>.
+
+       * gdk/win32/gdkevents.c: More event handling fixes and
+       simplification. Never generate motion events with is_hint true. We
+       used to do that on bogus grounds earlier. Windows sends
+       WM_MOUSEMOVE messages on button events even if the mouse hasn't
+       moved, ignore these.
+
+       * gdk/win32/gdkfont.c: Load all fonts as (pretended) fontsets.
+
+       * gdk/win32/gdkglobals.c
+       * gdk/win32/gdkprivate.h: Define a typedef for the pointer to
+       the TrackMouseEvent function, and use it.
+
+       * gdk/win32/gdkwindow.c: Terminate widechar string with a zero
+       char before calling WideCharToMultiByte in order to get a string
+       for the window title.
+
+       * gdk/win32/gdkdnd.c: Some more random hacking, ifdeffed out.
+
+       * gdk/win32/gdk.def: Remove obsolete functions.
+
+       * gdk/win32/makefile.{cygwin,msc}: Remove gdkcompat.{o,obj}. Add
+       /nodefaultlib and /defaultlib switches.
+
+       * gtk/gtkrc.c: s/gwin_getlocale/g_win32_getlocale/.
+
 1999-10-31  Tor Lillqvist  <tml@iki.fi>
 
        * gdk/gdkkeysyms.h: Add new keysyms from X11R6.4 (including
index 58777a85fc5b6aff67300308a8cdb0ca18573b75..608f6d7582204eec6e0dba17b7c7d082116a3f56 100644 (file)
@@ -1,3 +1,33 @@
+1999-11-04  Tor Lillqvist  <tml@iki.fi>
+
+       * config.h.win32: Don't define HAVE_DIMM_H if MSC, as you have to
+       get the Platform SDK to get <dimm.h>.
+
+       * gdk/win32/gdkevents.c: More event handling fixes and
+       simplification. Never generate motion events with is_hint true. We
+       used to do that on bogus grounds earlier. Windows sends
+       WM_MOUSEMOVE messages on button events even if the mouse hasn't
+       moved, ignore these.
+
+       * gdk/win32/gdkfont.c: Load all fonts as (pretended) fontsets.
+
+       * gdk/win32/gdkglobals.c
+       * gdk/win32/gdkprivate.h: Define a typedef for the pointer to
+       the TrackMouseEvent function, and use it.
+
+       * gdk/win32/gdkwindow.c: Terminate widechar string with a zero
+       char before calling WideCharToMultiByte in order to get a string
+       for the window title.
+
+       * gdk/win32/gdkdnd.c: Some more random hacking, ifdeffed out.
+
+       * gdk/win32/gdk.def: Remove obsolete functions.
+
+       * gdk/win32/makefile.{cygwin,msc}: Remove gdkcompat.{o,obj}. Add
+       /nodefaultlib and /defaultlib switches.
+
+       * gtk/gtkrc.c: s/gwin_getlocale/g_win32_getlocale/.
+
 1999-10-31  Tor Lillqvist  <tml@iki.fi>
 
        * gdk/gdkkeysyms.h: Add new keysyms from X11R6.4 (including
index 58777a85fc5b6aff67300308a8cdb0ca18573b75..608f6d7582204eec6e0dba17b7c7d082116a3f56 100644 (file)
@@ -1,3 +1,33 @@
+1999-11-04  Tor Lillqvist  <tml@iki.fi>
+
+       * config.h.win32: Don't define HAVE_DIMM_H if MSC, as you have to
+       get the Platform SDK to get <dimm.h>.
+
+       * gdk/win32/gdkevents.c: More event handling fixes and
+       simplification. Never generate motion events with is_hint true. We
+       used to do that on bogus grounds earlier. Windows sends
+       WM_MOUSEMOVE messages on button events even if the mouse hasn't
+       moved, ignore these.
+
+       * gdk/win32/gdkfont.c: Load all fonts as (pretended) fontsets.
+
+       * gdk/win32/gdkglobals.c
+       * gdk/win32/gdkprivate.h: Define a typedef for the pointer to
+       the TrackMouseEvent function, and use it.
+
+       * gdk/win32/gdkwindow.c: Terminate widechar string with a zero
+       char before calling WideCharToMultiByte in order to get a string
+       for the window title.
+
+       * gdk/win32/gdkdnd.c: Some more random hacking, ifdeffed out.
+
+       * gdk/win32/gdk.def: Remove obsolete functions.
+
+       * gdk/win32/makefile.{cygwin,msc}: Remove gdkcompat.{o,obj}. Add
+       /nodefaultlib and /defaultlib switches.
+
+       * gtk/gtkrc.c: s/gwin_getlocale/g_win32_getlocale/.
+
 1999-10-31  Tor Lillqvist  <tml@iki.fi>
 
        * gdk/gdkkeysyms.h: Add new keysyms from X11R6.4 (including
index 58777a85fc5b6aff67300308a8cdb0ca18573b75..608f6d7582204eec6e0dba17b7c7d082116a3f56 100644 (file)
@@ -1,3 +1,33 @@
+1999-11-04  Tor Lillqvist  <tml@iki.fi>
+
+       * config.h.win32: Don't define HAVE_DIMM_H if MSC, as you have to
+       get the Platform SDK to get <dimm.h>.
+
+       * gdk/win32/gdkevents.c: More event handling fixes and
+       simplification. Never generate motion events with is_hint true. We
+       used to do that on bogus grounds earlier. Windows sends
+       WM_MOUSEMOVE messages on button events even if the mouse hasn't
+       moved, ignore these.
+
+       * gdk/win32/gdkfont.c: Load all fonts as (pretended) fontsets.
+
+       * gdk/win32/gdkglobals.c
+       * gdk/win32/gdkprivate.h: Define a typedef for the pointer to
+       the TrackMouseEvent function, and use it.
+
+       * gdk/win32/gdkwindow.c: Terminate widechar string with a zero
+       char before calling WideCharToMultiByte in order to get a string
+       for the window title.
+
+       * gdk/win32/gdkdnd.c: Some more random hacking, ifdeffed out.
+
+       * gdk/win32/gdk.def: Remove obsolete functions.
+
+       * gdk/win32/makefile.{cygwin,msc}: Remove gdkcompat.{o,obj}. Add
+       /nodefaultlib and /defaultlib switches.
+
+       * gtk/gtkrc.c: s/gwin_getlocale/g_win32_getlocale/.
+
 1999-10-31  Tor Lillqvist  <tml@iki.fi>
 
        * gdk/gdkkeysyms.h: Add new keysyms from X11R6.4 (including
index 58777a85fc5b6aff67300308a8cdb0ca18573b75..608f6d7582204eec6e0dba17b7c7d082116a3f56 100644 (file)
@@ -1,3 +1,33 @@
+1999-11-04  Tor Lillqvist  <tml@iki.fi>
+
+       * config.h.win32: Don't define HAVE_DIMM_H if MSC, as you have to
+       get the Platform SDK to get <dimm.h>.
+
+       * gdk/win32/gdkevents.c: More event handling fixes and
+       simplification. Never generate motion events with is_hint true. We
+       used to do that on bogus grounds earlier. Windows sends
+       WM_MOUSEMOVE messages on button events even if the mouse hasn't
+       moved, ignore these.
+
+       * gdk/win32/gdkfont.c: Load all fonts as (pretended) fontsets.
+
+       * gdk/win32/gdkglobals.c
+       * gdk/win32/gdkprivate.h: Define a typedef for the pointer to
+       the TrackMouseEvent function, and use it.
+
+       * gdk/win32/gdkwindow.c: Terminate widechar string with a zero
+       char before calling WideCharToMultiByte in order to get a string
+       for the window title.
+
+       * gdk/win32/gdkdnd.c: Some more random hacking, ifdeffed out.
+
+       * gdk/win32/gdk.def: Remove obsolete functions.
+
+       * gdk/win32/makefile.{cygwin,msc}: Remove gdkcompat.{o,obj}. Add
+       /nodefaultlib and /defaultlib switches.
+
+       * gtk/gtkrc.c: s/gwin_getlocale/g_win32_getlocale/.
+
 1999-10-31  Tor Lillqvist  <tml@iki.fi>
 
        * gdk/gdkkeysyms.h: Add new keysyms from X11R6.4 (including
index a4483282bbbf71867f2b7374d1b6180d4279cf8f..486dbb6169e5d1198efcabb59a4fc7d71e70a0cf 100755 (executable)
 /* Define if you have the <dimm.h> header file
  * (available in the Platform SDK)
 */
-#ifdef _MSC_VER
-#define HAVE_DIMM_H 1
-#endif
+/* #define HAVE_DIMM_H 1 */
index 877c12d3450215207e641200f1878348722baca6..1f56d0e03706ab41605b563aacf9aa5905d7a32b 100644 (file)
@@ -277,12 +277,10 @@ EXPORTS
        gdk_window_clear
        gdk_window_clear_area
        gdk_window_clear_area_e
-       gdk_window_copy_area
        gdk_window_destroy
        gdk_window_foreign_new
        gdk_window_get_deskrelative_origin
        gdk_window_get_children
-       gdk_window_get_colormap
        gdk_window_get_events
        gdk_window_get_geometry
        gdk_window_get_origin
@@ -290,12 +288,9 @@ EXPORTS
        gdk_window_get_pointer
        gdk_window_get_position
        gdk_window_get_root_origin
-       gdk_window_get_size
        gdk_window_get_toplevel
        gdk_window_get_toplevels
-       gdk_window_get_type
        gdk_window_get_user_data
-       gdk_window_get_visual
        gdk_window_hide
        gdk_window_is_visible
        gdk_window_is_viewable
@@ -313,7 +308,6 @@ EXPORTS
        gdk_window_set_back_pixmap
        gdk_window_set_background
        gdk_window_set_child_shapes
-       gdk_window_set_colormap
        gdk_window_set_cursor
        gdk_window_set_decorations
        gdk_window_set_events
index 877c12d3450215207e641200f1878348722baca6..1f56d0e03706ab41605b563aacf9aa5905d7a32b 100644 (file)
@@ -277,12 +277,10 @@ EXPORTS
        gdk_window_clear
        gdk_window_clear_area
        gdk_window_clear_area_e
-       gdk_window_copy_area
        gdk_window_destroy
        gdk_window_foreign_new
        gdk_window_get_deskrelative_origin
        gdk_window_get_children
-       gdk_window_get_colormap
        gdk_window_get_events
        gdk_window_get_geometry
        gdk_window_get_origin
@@ -290,12 +288,9 @@ EXPORTS
        gdk_window_get_pointer
        gdk_window_get_position
        gdk_window_get_root_origin
-       gdk_window_get_size
        gdk_window_get_toplevel
        gdk_window_get_toplevels
-       gdk_window_get_type
        gdk_window_get_user_data
-       gdk_window_get_visual
        gdk_window_hide
        gdk_window_is_visible
        gdk_window_is_viewable
@@ -313,7 +308,6 @@ EXPORTS
        gdk_window_set_back_pixmap
        gdk_window_set_background
        gdk_window_set_child_shapes
-       gdk_window_set_colormap
        gdk_window_set_cursor
        gdk_window_set_decorations
        gdk_window_set_events
index 1c7f42a99db5a73da0d6cb5732db63063a4d3276..da6da4bb5e0339164c867b73593749af56c186cc 100644 (file)
@@ -29,6 +29,8 @@
 
 #include <string.h>
 
+/* #define OLE2_DND */
+
 #define INITGUID
 
 #include "gdkdnd.h"
 #include <shlguid.h>
 #endif
 
+#ifndef _MSC_VER
+static IID IID_IUnknown = {
+  0x00000000, 0x0000, 0x0000, { 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46 } };
+static IID IID_IDropSource = {
+  0x00000121, 0x0000, 0x0000, { 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46 } };
+static IID IID_IDropTarget = {
+  0x00000122, 0x0000, 0x0000, { 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46 } };
+#endif
+
 #include <gdk/gdk.h>
 
 typedef struct _GdkDragContextPrivate GdkDragContextPrivate;
@@ -65,73 +76,20 @@ typedef enum {
 
 #ifdef OLE2_DND
 
-#define PRINT_RIID(riid) \
-  g_print ("riid = %.08x-%.04x-%.04x-%.02x%.02x-%.02x%.02x%.02x%.02x%.02x%.02x", \
-          ((gulong *)  riid)[0], \
-          ((gushort *) riid)[2], \
-          ((gushort *) riid)[3], \
-          ((guchar *)  riid)[8], \
-          ((guchar *)  riid)[9], \
-          ((guchar *)  riid)[10], \
-          ((guchar *)  riid)[11], \
-          ((guchar *)  riid)[12], \
-          ((guchar *)  riid)[13], \
-          ((guchar *)  riid)[14], \
-          ((guchar *)  riid)[15]);
-
-
-HRESULT STDMETHODCALLTYPE
-  m_query_interface_target (IDropTarget __RPC_FAR *This,
-                           /* [in] */ REFIID riid,
-                           /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-
-ULONG STDMETHODCALLTYPE
-  m_add_ref_target (IDropTarget __RPC_FAR *This);
-
-ULONG STDMETHODCALLTYPE
-  m_release_target (IDropTarget __RPC_FAR *This);
-
-HRESULT STDMETHODCALLTYPE 
-  m_drag_enter (IDropTarget __RPC_FAR *This,
-               /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
-               /* [in] */ DWORD grfKeyState,
-               /* [in] */ POINTL pt,
-               /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
-
-HRESULT STDMETHODCALLTYPE
-  m_drag_over (IDropTarget __RPC_FAR *This,
-              /* [in] */ DWORD grfKeyState,
-              /* [in] */ POINTL pt,
-              /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
-
-HRESULT STDMETHODCALLTYPE
-  m_drag_leave (IDropTarget __RPC_FAR *This);
-
-HRESULT STDMETHODCALLTYPE
-  m_drop (IDropTarget __RPC_FAR *This,
-         /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
-         /* [in] */ DWORD grfKeyState,
-         /* [in] */ POINTL pt,
-         /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
-
-HRESULT STDMETHODCALLTYPE
-  m_query_interface_source (IDropSource __RPC_FAR *This,
-                           /* [in] */ REFIID riid,
-                           /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-
-ULONG STDMETHODCALLTYPE
-  m_add_ref_source (IDropSource __RPC_FAR *This);
-
-ULONG STDMETHODCALLTYPE
-  m_release_source (IDropSource __RPC_FAR *This);
-
-HRESULT STDMETHODCALLTYPE
-  m_query_continue_drag (IDropSource __RPC_FAR *This,
-                        /* [in] */ BOOL fEscapePressed,
-                        /* [in] */ DWORD grfKeyState);
-HRESULT STDMETHODCALLTYPE
-  m_give_feedback (IDropSource __RPC_FAR *This,
-                  /* [in] */ DWORD dwEffect);
+#define PRINT_GUID(guid) \
+  g_print ("guid = %.08x-%.04x-%.04x-%.02x%.02x-%.02x%.02x%.02x%.02x%.02x%.02x", \
+          ((gulong *)  guid)[0], \
+          ((gushort *) guid)[2], \
+          ((gushort *) guid)[3], \
+          ((guchar *)  guid)[8], \
+          ((guchar *)  guid)[9], \
+          ((guchar *)  guid)[10], \
+          ((guchar *)  guid)[11], \
+          ((guchar *)  guid)[12], \
+          ((guchar *)  guid)[13], \
+          ((guchar *)  guid)[14], \
+          ((guchar *)  guid)[15]);
+
 
 #endif /* OLE2_DND */
 
@@ -169,28 +127,111 @@ gdk_drag_context_new        (void)
   return (GdkDragContext *)result;
 }
 
-#ifdef OLE2_DND
+void
+gdk_drag_context_ref (GdkDragContext *context)
+{
+  g_return_if_fail (context != NULL);
+
+  ((GdkDragContextPrivate *)context)->ref_count++;
+}
+
+void
+gdk_drag_context_unref (GdkDragContext *context)
+{
+  GdkDragContextPrivate *private = (GdkDragContextPrivate *)context;
+  
+  g_return_if_fail (context != NULL);
+
+  private->ref_count--;
+
+  GDK_NOTE (DND, g_print ("gdk_drag_context_unref: %d%s\n",
+                         private->ref_count,
+                         (private->ref_count == 0 ? " freeing" : "")));
+
+  if (private->ref_count == 0)
+    {
+      g_dataset_destroy (private);
+      
+      g_list_free (context->targets);
+
+      if (context->source_window)
+       gdk_window_unref (context->source_window);
+
+      if (context->dest_window)
+       gdk_window_unref (context->dest_window);
+
+      contexts = g_list_remove (contexts, private);
+      g_free (private);
+    }
+}
+
+#if 0
+
+static GdkDragContext *
+gdk_drag_context_find (gboolean is_source,
+                      HWND     source_xid,
+                      HWND     dest_xid)
+{
+  GList *tmp_list = contexts;
+  GdkDragContext *context;
+
+  while (tmp_list)
+    {
+      context = (GdkDragContext *)tmp_list->data;
+
+      if ((!context->is_source == !is_source) &&
+         ((source_xid == None) || (context->source_window &&
+           (GDK_WINDOW_XWINDOW (context->source_window) == source_xid))) &&
+         ((dest_xid == None) || (context->dest_window &&
+           (GDK_WINDOW_XWINDOW (context->dest_window) == dest_xid))))
+       return context;
+      
+      tmp_list = tmp_list->next;
+    }
+
+  return NULL;
+}
+
+#endif
 
 typedef struct {
+#ifdef OLE2_DND
   IDropTarget idt;
+#endif
   GdkDragContext *context;
 } target_drag_context;
 
 typedef struct {
+#ifdef OLE2_DND
   IDropSource ids;
+#endif
   GdkDragContext *context;
 } source_drag_context;
 
-HRESULT STDMETHODCALLTYPE
+#ifdef OLE2_DND
+
+static ULONG STDMETHODCALLTYPE
+m_add_ref_target (IDropTarget __RPC_FAR *This)
+{
+  target_drag_context *ctx = (target_drag_context *) This;
+  GdkDragContextPrivate *private = (GdkDragContextPrivate *) ctx->context;
+
+  GDK_NOTE (DND, g_print ("m_add_ref_target\n"));
+  gdk_drag_context_ref (ctx->context);
+  
+  return private->ref_count;
+}
+
+static HRESULT STDMETHODCALLTYPE
 m_query_interface_target (IDropTarget __RPC_FAR *This,
-                         /* [in] */ REFIID riid,
-                         /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
+                         REFIID riid,
+                         void __RPC_FAR *__RPC_FAR *ppvObject)
 {
   GDK_NOTE (DND, g_print ("m_query_interface_target\n"));
 
   *ppvObject = NULL;
 
-  PRINT_RIID (riid);
+  PRINT_GUID (riid);
 
   if (IsEqualGUID (riid, &IID_IUnknown))
     {
@@ -213,19 +254,7 @@ m_query_interface_target (IDropTarget __RPC_FAR *This,
     }
 }
 
-ULONG STDMETHODCALLTYPE
-m_add_ref_target (IDropTarget __RPC_FAR *This)
-{
-  target_drag_context *ctx = (target_drag_context *) This;
-  GdkDragContextPrivate *private = (GdkDragContextPrivate *) ctx->context;
-
-  GDK_NOTE (DND, g_print ("m_add_ref_target\n"));
-  gdk_drag_context_ref (ctx->context);
-  
-  return private->ref_count;
-}
-
-ULONG STDMETHODCALLTYPE
+static ULONG STDMETHODCALLTYPE
 m_release_target (IDropTarget __RPC_FAR *This)
 {
   target_drag_context *ctx = (target_drag_context *) This;
@@ -243,55 +272,67 @@ m_release_target (IDropTarget __RPC_FAR *This)
     return private->ref_count - 1;
 }
 
-HRESULT STDMETHODCALLTYPE 
+static HRESULT STDMETHODCALLTYPE 
 m_drag_enter (IDropTarget __RPC_FAR *This,
-             /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
-             /* [in] */ DWORD grfKeyState,
-             /* [in] */ POINTL pt,
-             /* [out][in] */ DWORD __RPC_FAR *pdwEffect)
+             IDataObject __RPC_FAR *pDataObj,
+             DWORD grfKeyState,
+             POINTL pt,
+             DWORD __RPC_FAR *pdwEffect)
 {
   GDK_NOTE (DND, g_print ("m_drag_enter\n"));
   return E_UNEXPECTED;
 }
 
-HRESULT STDMETHODCALLTYPE
+static HRESULT STDMETHODCALLTYPE
 m_drag_over (IDropTarget __RPC_FAR *This,
-            /* [in] */ DWORD grfKeyState,
-            /* [in] */ POINTL pt,
-            /* [out][in] */ DWORD __RPC_FAR *pdwEffect)
+            DWORD grfKeyState,
+            POINTL pt,
+            DWORD __RPC_FAR *pdwEffect)
 {
   GDK_NOTE (DND, g_print ("m_drag_over\n"));
   return E_UNEXPECTED;
 }
 
-HRESULT STDMETHODCALLTYPE
+static HRESULT STDMETHODCALLTYPE
 m_drag_leave (IDropTarget __RPC_FAR *This)
 {
   GDK_NOTE (DND, g_print ("m_drag_leave\n"));
   return E_UNEXPECTED;
 }
 
-HRESULT STDMETHODCALLTYPE
+static HRESULT STDMETHODCALLTYPE
 m_drop (IDropTarget __RPC_FAR *This,
-       /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
-       /* [in] */ DWORD grfKeyState,
-       /* [in] */ POINTL pt,
-       /* [out][in] */ DWORD __RPC_FAR *pdwEffect)
+       IDataObject __RPC_FAR *pDataObj,
+       DWORD grfKeyState,
+       POINTL pt,
+       DWORD __RPC_FAR *pdwEffect)
 {
   GDK_NOTE (DND, g_print ("m_drop\n"));
   return E_UNEXPECTED;
 }
 
-HRESULT STDMETHODCALLTYPE
+static ULONG STDMETHODCALLTYPE
+m_add_ref_source (IDropSource __RPC_FAR *This)
+{
+  source_drag_context *ctx = (source_drag_context *) This;
+  GdkDragContextPrivate *private = (GdkDragContextPrivate *) ctx->context;
+
+  GDK_NOTE (DND, g_print ("m_add_ref_source\n"));
+  gdk_drag_context_ref (ctx->context);
+  
+  return private->ref_count;
+}
+
+static HRESULT STDMETHODCALLTYPE
 m_query_interface_source (IDropSource __RPC_FAR *This,
-                         /* [in] */ REFIID riid,
-                         /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
+                         REFIID riid,
+                         void __RPC_FAR *__RPC_FAR *ppvObject)
 {
   GDK_NOTE (DND, g_print ("m_query_interface_source\n"));
 
   *ppvObject = NULL;
 
-  PRINT_RIID (riid);
+  PRINT_GUID (riid);
   if (IsEqualGUID (riid, &IID_IUnknown))
     {
       g_print ("...IUnknown\n");
@@ -313,19 +354,7 @@ m_query_interface_source (IDropSource __RPC_FAR *This,
     }
 }
 
-ULONG STDMETHODCALLTYPE
-m_add_ref_source (IDropSource __RPC_FAR *This)
-{
-  source_drag_context *ctx = (source_drag_context *) This;
-  GdkDragContextPrivate *private = (GdkDragContextPrivate *) ctx->context;
-
-  GDK_NOTE (DND, g_print ("m_add_ref_source\n"));
-  gdk_drag_context_ref (ctx->context);
-  
-  return private->ref_count;
-}
-
-ULONG STDMETHODCALLTYPE
+static ULONG STDMETHODCALLTYPE
 m_release_source (IDropSource __RPC_FAR *This)
 {
   source_drag_context *ctx = (source_drag_context *) This;
@@ -343,23 +372,115 @@ m_release_source (IDropSource __RPC_FAR *This)
     return private->ref_count - 1;
 }
 
-HRESULT STDMETHODCALLTYPE
+static HRESULT STDMETHODCALLTYPE
 m_query_continue_drag (IDropSource __RPC_FAR *This,
-                      /* [in] */ BOOL fEscapePressed,
-                      /* [in] */ DWORD grfKeyState)
+                      BOOL fEscapePressed,
+                      DWORD grfKeyState)
 {
   GDK_NOTE (DND, g_print ("m_query_continue_drag\n"));
   return E_UNEXPECTED;
 }
 
-HRESULT STDMETHODCALLTYPE
+static HRESULT STDMETHODCALLTYPE
 m_give_feedback (IDropSource __RPC_FAR *This,
-                /* [in] */ DWORD dwEffect)
+                DWORD dwEffect)
 {
   GDK_NOTE (DND, g_print ("m_give_feedback\n"));
   return E_UNEXPECTED;
 }
 
+static HRESULT STDMETHODCALLTYPE
+m_query_interface_object (IDataObject __RPC_FAR *This,
+                         REFIID riid,
+                         void __RPC_FAR *__RPC_FAR *ppvObject)
+{
+  return E_UNEXPECTED;
+}
+
+static ULONG STDMETHODCALLTYPE
+m_add_ref_object (IDataObject __RPC_FAR *This)
+{
+  return E_UNEXPECTED;
+}
+
+static ULONG STDMETHODCALLTYPE
+m_release_object (IDataObject __RPC_FAR *This)
+{
+  return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_get_data (IDataObject __RPC_FAR *This,
+           FORMATETC *pFormatEtc,
+           STGMEDIUM *pMedium)
+{
+  return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_get_data_here (IDataObject __RPC_FAR *This,
+                FORMATETC *pFormatEtc,
+                STGMEDIUM *pMedium)
+{
+  return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_query_get_data (IDataObject __RPC_FAR *This,
+                 FORMATETC *pFormatEtc)
+{
+  return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_get_canonical_format_etc (IDataObject __RPC_FAR *This,
+                           FORMATETC *pFormatEtcIn,
+                           FORMATETC *pFormatEtcOut)
+{
+  return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_set_data (IDataObject __RPC_FAR *This,
+           FORMATETC *pFormatEtc,
+           STGMEDIUM *pMedium,
+           BOOL fRelease)
+{
+  return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_enum_format_etc (IDataObject __RPC_FAR *This,
+                  DWORD dwDirection,
+                  IEnumFORMATETC **ppEnumFormatEtc)
+{
+  return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+ m_d_advise (IDataObject __RPC_FAR *This,
+            FORMATETC *pFormatetc,
+            DWORD advf,
+            IAdviseSink *pAdvSink,
+            DWORD *pdwConnection)
+{
+  return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+ m_d_unadvise (IDataObject __RPC_FAR *This,
+              DWORD dwConnection)
+{
+  return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_enum_d_advise (IDataObject __RPC_FAR *This,
+                IEnumSTATDATA **ppenumAdvise)
+{
+  return E_UNEXPECTED;
+}
+               
 static IDropTargetVtbl idt_vtbl = {
   m_query_interface_target,
   m_add_ref_target,
@@ -378,103 +499,55 @@ static IDropSourceVtbl ids_vtbl = {
   m_give_feedback
 };
 
-target_drag_context *
+static IDataObjectVtbl ido_vtbl = {
+  m_query_interface_object,
+  m_add_ref_object,
+  m_release_object,
+  m_get_data,
+  m_get_data_here,
+  m_query_get_data,
+  m_get_canonical_format_etc,
+  m_set_data,
+  m_enum_format_etc,
+  m_d_advise,
+  m_d_unadvise,
+  m_enum_d_advise
+};
+
+#endif /* OLE2_DND */
+
+static target_drag_context *
 target_context_new (void)
 {
   target_drag_context *result;
 
   result = g_new0 (target_drag_context, 1);
 
+#ifdef OLE2_DND
   result->idt.lpVtbl = &idt_vtbl;
+#endif
 
   result->context = gdk_drag_context_new ();
 
   return result;
 }
 
-source_drag_context *
+static source_drag_context *
 source_context_new (void)
 {
   source_drag_context *result;
 
   result = g_new0 (source_drag_context, 1);
 
+#ifdef OLE2_DND
   result->ids.lpVtbl = &ids_vtbl;
+#endif
 
   result->context = gdk_drag_context_new ();
 
   return result;
 }
 
-#endif /* OLE2_DND */
-
-void
-gdk_drag_context_ref (GdkDragContext *context)
-{
-  g_return_if_fail (context != NULL);
-
-  ((GdkDragContextPrivate *)context)->ref_count++;
-}
-
-void
-gdk_drag_context_unref (GdkDragContext *context)
-{
-  GdkDragContextPrivate *private = (GdkDragContextPrivate *)context;
-  
-  g_return_if_fail (context != NULL);
-
-  private->ref_count--;
-
-  GDK_NOTE (DND, g_print ("gdk_drag_context_unref: %d%s\n",
-                         private->ref_count,
-                         (private->ref_count == 0 ? " freeing" : "")));
-
-  if (private->ref_count == 0)
-    {
-      g_dataset_destroy (private);
-      
-      g_list_free (context->targets);
-
-      if (context->source_window)
-       gdk_window_unref (context->source_window);
-
-      if (context->dest_window)
-       gdk_window_unref (context->dest_window);
-
-      contexts = g_list_remove (contexts, private);
-      g_free (private);
-    }
-}
-
-#if 0
-
-static GdkDragContext *
-gdk_drag_context_find (gboolean is_source,
-                      HWND     source_xid,
-                      HWND     dest_xid)
-{
-  GList *tmp_list = contexts;
-  GdkDragContext *context;
-
-  while (tmp_list)
-    {
-      context = (GdkDragContext *)tmp_list->data;
-
-      if ((!context->is_source == !is_source) &&
-         ((source_xid == None) || (context->source_window &&
-           (GDK_WINDOW_XWINDOW (context->source_window) == source_xid))) &&
-         ((dest_xid == None) || (context->dest_window &&
-           (GDK_WINDOW_XWINDOW (context->dest_window) == dest_xid))))
-       return context;
-      
-      tmp_list = tmp_list->next;
-    }
-
-  return NULL;
-}
-
-#endif
-
 #ifdef _MSC_VER
 
 /* From MS Knowledge Base article Q130698 */
@@ -693,29 +766,32 @@ gdk_drag_begin (GdkWindow     *window,
                GList         *targets)
 {
   GList *tmp_list;
-  GdkDragContext *new_context;
+  source_drag_context *ctx;
   
   g_return_val_if_fail (window != NULL, NULL);
 
   GDK_NOTE (DND, g_print ("gdk_drag_begin\n"));
 
-  new_context = gdk_drag_context_new ();
-  new_context->is_source = TRUE;
-  new_context->source_window = window;
+  ctx = source_context_new ();
+  ctx->context->is_source = TRUE;
+  ctx->context->source_window = window;
   gdk_window_ref (window);
 
   tmp_list = g_list_last (targets);
-  new_context->targets = NULL;
+  ctx->context->targets = NULL;
   while (tmp_list)
     {
-      new_context->targets = g_list_prepend (new_context->targets,
-                                            tmp_list->data);
+      ctx->context->targets = g_list_prepend (ctx->context->targets,
+                                             tmp_list->data);
       tmp_list = tmp_list->prev;
     }
 
-  new_context->actions = 0;
+  ctx->context->actions = 0;
 
-  return new_context;
+#if 0
+  DoDragDrop (...);
+#endif
+  return ctx->context;
 }
 
 guint32
index 1c7f42a99db5a73da0d6cb5732db63063a4d3276..da6da4bb5e0339164c867b73593749af56c186cc 100644 (file)
@@ -29,6 +29,8 @@
 
 #include <string.h>
 
+/* #define OLE2_DND */
+
 #define INITGUID
 
 #include "gdkdnd.h"
 #include <shlguid.h>
 #endif
 
+#ifndef _MSC_VER
+static IID IID_IUnknown = {
+  0x00000000, 0x0000, 0x0000, { 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46 } };
+static IID IID_IDropSource = {
+  0x00000121, 0x0000, 0x0000, { 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46 } };
+static IID IID_IDropTarget = {
+  0x00000122, 0x0000, 0x0000, { 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46 } };
+#endif
+
 #include <gdk/gdk.h>
 
 typedef struct _GdkDragContextPrivate GdkDragContextPrivate;
@@ -65,73 +76,20 @@ typedef enum {
 
 #ifdef OLE2_DND
 
-#define PRINT_RIID(riid) \
-  g_print ("riid = %.08x-%.04x-%.04x-%.02x%.02x-%.02x%.02x%.02x%.02x%.02x%.02x", \
-          ((gulong *)  riid)[0], \
-          ((gushort *) riid)[2], \
-          ((gushort *) riid)[3], \
-          ((guchar *)  riid)[8], \
-          ((guchar *)  riid)[9], \
-          ((guchar *)  riid)[10], \
-          ((guchar *)  riid)[11], \
-          ((guchar *)  riid)[12], \
-          ((guchar *)  riid)[13], \
-          ((guchar *)  riid)[14], \
-          ((guchar *)  riid)[15]);
-
-
-HRESULT STDMETHODCALLTYPE
-  m_query_interface_target (IDropTarget __RPC_FAR *This,
-                           /* [in] */ REFIID riid,
-                           /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-
-ULONG STDMETHODCALLTYPE
-  m_add_ref_target (IDropTarget __RPC_FAR *This);
-
-ULONG STDMETHODCALLTYPE
-  m_release_target (IDropTarget __RPC_FAR *This);
-
-HRESULT STDMETHODCALLTYPE 
-  m_drag_enter (IDropTarget __RPC_FAR *This,
-               /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
-               /* [in] */ DWORD grfKeyState,
-               /* [in] */ POINTL pt,
-               /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
-
-HRESULT STDMETHODCALLTYPE
-  m_drag_over (IDropTarget __RPC_FAR *This,
-              /* [in] */ DWORD grfKeyState,
-              /* [in] */ POINTL pt,
-              /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
-
-HRESULT STDMETHODCALLTYPE
-  m_drag_leave (IDropTarget __RPC_FAR *This);
-
-HRESULT STDMETHODCALLTYPE
-  m_drop (IDropTarget __RPC_FAR *This,
-         /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
-         /* [in] */ DWORD grfKeyState,
-         /* [in] */ POINTL pt,
-         /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
-
-HRESULT STDMETHODCALLTYPE
-  m_query_interface_source (IDropSource __RPC_FAR *This,
-                           /* [in] */ REFIID riid,
-                           /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-
-ULONG STDMETHODCALLTYPE
-  m_add_ref_source (IDropSource __RPC_FAR *This);
-
-ULONG STDMETHODCALLTYPE
-  m_release_source (IDropSource __RPC_FAR *This);
-
-HRESULT STDMETHODCALLTYPE
-  m_query_continue_drag (IDropSource __RPC_FAR *This,
-                        /* [in] */ BOOL fEscapePressed,
-                        /* [in] */ DWORD grfKeyState);
-HRESULT STDMETHODCALLTYPE
-  m_give_feedback (IDropSource __RPC_FAR *This,
-                  /* [in] */ DWORD dwEffect);
+#define PRINT_GUID(guid) \
+  g_print ("guid = %.08x-%.04x-%.04x-%.02x%.02x-%.02x%.02x%.02x%.02x%.02x%.02x", \
+          ((gulong *)  guid)[0], \
+          ((gushort *) guid)[2], \
+          ((gushort *) guid)[3], \
+          ((guchar *)  guid)[8], \
+          ((guchar *)  guid)[9], \
+          ((guchar *)  guid)[10], \
+          ((guchar *)  guid)[11], \
+          ((guchar *)  guid)[12], \
+          ((guchar *)  guid)[13], \
+          ((guchar *)  guid)[14], \
+          ((guchar *)  guid)[15]);
+
 
 #endif /* OLE2_DND */
 
@@ -169,28 +127,111 @@ gdk_drag_context_new        (void)
   return (GdkDragContext *)result;
 }
 
-#ifdef OLE2_DND
+void
+gdk_drag_context_ref (GdkDragContext *context)
+{
+  g_return_if_fail (context != NULL);
+
+  ((GdkDragContextPrivate *)context)->ref_count++;
+}
+
+void
+gdk_drag_context_unref (GdkDragContext *context)
+{
+  GdkDragContextPrivate *private = (GdkDragContextPrivate *)context;
+  
+  g_return_if_fail (context != NULL);
+
+  private->ref_count--;
+
+  GDK_NOTE (DND, g_print ("gdk_drag_context_unref: %d%s\n",
+                         private->ref_count,
+                         (private->ref_count == 0 ? " freeing" : "")));
+
+  if (private->ref_count == 0)
+    {
+      g_dataset_destroy (private);
+      
+      g_list_free (context->targets);
+
+      if (context->source_window)
+       gdk_window_unref (context->source_window);
+
+      if (context->dest_window)
+       gdk_window_unref (context->dest_window);
+
+      contexts = g_list_remove (contexts, private);
+      g_free (private);
+    }
+}
+
+#if 0
+
+static GdkDragContext *
+gdk_drag_context_find (gboolean is_source,
+                      HWND     source_xid,
+                      HWND     dest_xid)
+{
+  GList *tmp_list = contexts;
+  GdkDragContext *context;
+
+  while (tmp_list)
+    {
+      context = (GdkDragContext *)tmp_list->data;
+
+      if ((!context->is_source == !is_source) &&
+         ((source_xid == None) || (context->source_window &&
+           (GDK_WINDOW_XWINDOW (context->source_window) == source_xid))) &&
+         ((dest_xid == None) || (context->dest_window &&
+           (GDK_WINDOW_XWINDOW (context->dest_window) == dest_xid))))
+       return context;
+      
+      tmp_list = tmp_list->next;
+    }
+
+  return NULL;
+}
+
+#endif
 
 typedef struct {
+#ifdef OLE2_DND
   IDropTarget idt;
+#endif
   GdkDragContext *context;
 } target_drag_context;
 
 typedef struct {
+#ifdef OLE2_DND
   IDropSource ids;
+#endif
   GdkDragContext *context;
 } source_drag_context;
 
-HRESULT STDMETHODCALLTYPE
+#ifdef OLE2_DND
+
+static ULONG STDMETHODCALLTYPE
+m_add_ref_target (IDropTarget __RPC_FAR *This)
+{
+  target_drag_context *ctx = (target_drag_context *) This;
+  GdkDragContextPrivate *private = (GdkDragContextPrivate *) ctx->context;
+
+  GDK_NOTE (DND, g_print ("m_add_ref_target\n"));
+  gdk_drag_context_ref (ctx->context);
+  
+  return private->ref_count;
+}
+
+static HRESULT STDMETHODCALLTYPE
 m_query_interface_target (IDropTarget __RPC_FAR *This,
-                         /* [in] */ REFIID riid,
-                         /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
+                         REFIID riid,
+                         void __RPC_FAR *__RPC_FAR *ppvObject)
 {
   GDK_NOTE (DND, g_print ("m_query_interface_target\n"));
 
   *ppvObject = NULL;
 
-  PRINT_RIID (riid);
+  PRINT_GUID (riid);
 
   if (IsEqualGUID (riid, &IID_IUnknown))
     {
@@ -213,19 +254,7 @@ m_query_interface_target (IDropTarget __RPC_FAR *This,
     }
 }
 
-ULONG STDMETHODCALLTYPE
-m_add_ref_target (IDropTarget __RPC_FAR *This)
-{
-  target_drag_context *ctx = (target_drag_context *) This;
-  GdkDragContextPrivate *private = (GdkDragContextPrivate *) ctx->context;
-
-  GDK_NOTE (DND, g_print ("m_add_ref_target\n"));
-  gdk_drag_context_ref (ctx->context);
-  
-  return private->ref_count;
-}
-
-ULONG STDMETHODCALLTYPE
+static ULONG STDMETHODCALLTYPE
 m_release_target (IDropTarget __RPC_FAR *This)
 {
   target_drag_context *ctx = (target_drag_context *) This;
@@ -243,55 +272,67 @@ m_release_target (IDropTarget __RPC_FAR *This)
     return private->ref_count - 1;
 }
 
-HRESULT STDMETHODCALLTYPE 
+static HRESULT STDMETHODCALLTYPE 
 m_drag_enter (IDropTarget __RPC_FAR *This,
-             /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
-             /* [in] */ DWORD grfKeyState,
-             /* [in] */ POINTL pt,
-             /* [out][in] */ DWORD __RPC_FAR *pdwEffect)
+             IDataObject __RPC_FAR *pDataObj,
+             DWORD grfKeyState,
+             POINTL pt,
+             DWORD __RPC_FAR *pdwEffect)
 {
   GDK_NOTE (DND, g_print ("m_drag_enter\n"));
   return E_UNEXPECTED;
 }
 
-HRESULT STDMETHODCALLTYPE
+static HRESULT STDMETHODCALLTYPE
 m_drag_over (IDropTarget __RPC_FAR *This,
-            /* [in] */ DWORD grfKeyState,
-            /* [in] */ POINTL pt,
-            /* [out][in] */ DWORD __RPC_FAR *pdwEffect)
+            DWORD grfKeyState,
+            POINTL pt,
+            DWORD __RPC_FAR *pdwEffect)
 {
   GDK_NOTE (DND, g_print ("m_drag_over\n"));
   return E_UNEXPECTED;
 }
 
-HRESULT STDMETHODCALLTYPE
+static HRESULT STDMETHODCALLTYPE
 m_drag_leave (IDropTarget __RPC_FAR *This)
 {
   GDK_NOTE (DND, g_print ("m_drag_leave\n"));
   return E_UNEXPECTED;
 }
 
-HRESULT STDMETHODCALLTYPE
+static HRESULT STDMETHODCALLTYPE
 m_drop (IDropTarget __RPC_FAR *This,
-       /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
-       /* [in] */ DWORD grfKeyState,
-       /* [in] */ POINTL pt,
-       /* [out][in] */ DWORD __RPC_FAR *pdwEffect)
+       IDataObject __RPC_FAR *pDataObj,
+       DWORD grfKeyState,
+       POINTL pt,
+       DWORD __RPC_FAR *pdwEffect)
 {
   GDK_NOTE (DND, g_print ("m_drop\n"));
   return E_UNEXPECTED;
 }
 
-HRESULT STDMETHODCALLTYPE
+static ULONG STDMETHODCALLTYPE
+m_add_ref_source (IDropSource __RPC_FAR *This)
+{
+  source_drag_context *ctx = (source_drag_context *) This;
+  GdkDragContextPrivate *private = (GdkDragContextPrivate *) ctx->context;
+
+  GDK_NOTE (DND, g_print ("m_add_ref_source\n"));
+  gdk_drag_context_ref (ctx->context);
+  
+  return private->ref_count;
+}
+
+static HRESULT STDMETHODCALLTYPE
 m_query_interface_source (IDropSource __RPC_FAR *This,
-                         /* [in] */ REFIID riid,
-                         /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
+                         REFIID riid,
+                         void __RPC_FAR *__RPC_FAR *ppvObject)
 {
   GDK_NOTE (DND, g_print ("m_query_interface_source\n"));
 
   *ppvObject = NULL;
 
-  PRINT_RIID (riid);
+  PRINT_GUID (riid);
   if (IsEqualGUID (riid, &IID_IUnknown))
     {
       g_print ("...IUnknown\n");
@@ -313,19 +354,7 @@ m_query_interface_source (IDropSource __RPC_FAR *This,
     }
 }
 
-ULONG STDMETHODCALLTYPE
-m_add_ref_source (IDropSource __RPC_FAR *This)
-{
-  source_drag_context *ctx = (source_drag_context *) This;
-  GdkDragContextPrivate *private = (GdkDragContextPrivate *) ctx->context;
-
-  GDK_NOTE (DND, g_print ("m_add_ref_source\n"));
-  gdk_drag_context_ref (ctx->context);
-  
-  return private->ref_count;
-}
-
-ULONG STDMETHODCALLTYPE
+static ULONG STDMETHODCALLTYPE
 m_release_source (IDropSource __RPC_FAR *This)
 {
   source_drag_context *ctx = (source_drag_context *) This;
@@ -343,23 +372,115 @@ m_release_source (IDropSource __RPC_FAR *This)
     return private->ref_count - 1;
 }
 
-HRESULT STDMETHODCALLTYPE
+static HRESULT STDMETHODCALLTYPE
 m_query_continue_drag (IDropSource __RPC_FAR *This,
-                      /* [in] */ BOOL fEscapePressed,
-                      /* [in] */ DWORD grfKeyState)
+                      BOOL fEscapePressed,
+                      DWORD grfKeyState)
 {
   GDK_NOTE (DND, g_print ("m_query_continue_drag\n"));
   return E_UNEXPECTED;
 }
 
-HRESULT STDMETHODCALLTYPE
+static HRESULT STDMETHODCALLTYPE
 m_give_feedback (IDropSource __RPC_FAR *This,
-                /* [in] */ DWORD dwEffect)
+                DWORD dwEffect)
 {
   GDK_NOTE (DND, g_print ("m_give_feedback\n"));
   return E_UNEXPECTED;
 }
 
+static HRESULT STDMETHODCALLTYPE
+m_query_interface_object (IDataObject __RPC_FAR *This,
+                         REFIID riid,
+                         void __RPC_FAR *__RPC_FAR *ppvObject)
+{
+  return E_UNEXPECTED;
+}
+
+static ULONG STDMETHODCALLTYPE
+m_add_ref_object (IDataObject __RPC_FAR *This)
+{
+  return E_UNEXPECTED;
+}
+
+static ULONG STDMETHODCALLTYPE
+m_release_object (IDataObject __RPC_FAR *This)
+{
+  return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_get_data (IDataObject __RPC_FAR *This,
+           FORMATETC *pFormatEtc,
+           STGMEDIUM *pMedium)
+{
+  return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_get_data_here (IDataObject __RPC_FAR *This,
+                FORMATETC *pFormatEtc,
+                STGMEDIUM *pMedium)
+{
+  return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_query_get_data (IDataObject __RPC_FAR *This,
+                 FORMATETC *pFormatEtc)
+{
+  return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_get_canonical_format_etc (IDataObject __RPC_FAR *This,
+                           FORMATETC *pFormatEtcIn,
+                           FORMATETC *pFormatEtcOut)
+{
+  return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_set_data (IDataObject __RPC_FAR *This,
+           FORMATETC *pFormatEtc,
+           STGMEDIUM *pMedium,
+           BOOL fRelease)
+{
+  return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_enum_format_etc (IDataObject __RPC_FAR *This,
+                  DWORD dwDirection,
+                  IEnumFORMATETC **ppEnumFormatEtc)
+{
+  return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+ m_d_advise (IDataObject __RPC_FAR *This,
+            FORMATETC *pFormatetc,
+            DWORD advf,
+            IAdviseSink *pAdvSink,
+            DWORD *pdwConnection)
+{
+  return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+ m_d_unadvise (IDataObject __RPC_FAR *This,
+              DWORD dwConnection)
+{
+  return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_enum_d_advise (IDataObject __RPC_FAR *This,
+                IEnumSTATDATA **ppenumAdvise)
+{
+  return E_UNEXPECTED;
+}
+               
 static IDropTargetVtbl idt_vtbl = {
   m_query_interface_target,
   m_add_ref_target,
@@ -378,103 +499,55 @@ static IDropSourceVtbl ids_vtbl = {
   m_give_feedback
 };
 
-target_drag_context *
+static IDataObjectVtbl ido_vtbl = {
+  m_query_interface_object,
+  m_add_ref_object,
+  m_release_object,
+  m_get_data,
+  m_get_data_here,
+  m_query_get_data,
+  m_get_canonical_format_etc,
+  m_set_data,
+  m_enum_format_etc,
+  m_d_advise,
+  m_d_unadvise,
+  m_enum_d_advise
+};
+
+#endif /* OLE2_DND */
+
+static target_drag_context *
 target_context_new (void)
 {
   target_drag_context *result;
 
   result = g_new0 (target_drag_context, 1);
 
+#ifdef OLE2_DND
   result->idt.lpVtbl = &idt_vtbl;
+#endif
 
   result->context = gdk_drag_context_new ();
 
   return result;
 }
 
-source_drag_context *
+static source_drag_context *
 source_context_new (void)
 {
   source_drag_context *result;
 
   result = g_new0 (source_drag_context, 1);
 
+#ifdef OLE2_DND
   result->ids.lpVtbl = &ids_vtbl;
+#endif
 
   result->context = gdk_drag_context_new ();
 
   return result;
 }
 
-#endif /* OLE2_DND */
-
-void
-gdk_drag_context_ref (GdkDragContext *context)
-{
-  g_return_if_fail (context != NULL);
-
-  ((GdkDragContextPrivate *)context)->ref_count++;
-}
-
-void
-gdk_drag_context_unref (GdkDragContext *context)
-{
-  GdkDragContextPrivate *private = (GdkDragContextPrivate *)context;
-  
-  g_return_if_fail (context != NULL);
-
-  private->ref_count--;
-
-  GDK_NOTE (DND, g_print ("gdk_drag_context_unref: %d%s\n",
-                         private->ref_count,
-                         (private->ref_count == 0 ? " freeing" : "")));
-
-  if (private->ref_count == 0)
-    {
-      g_dataset_destroy (private);
-      
-      g_list_free (context->targets);
-
-      if (context->source_window)
-       gdk_window_unref (context->source_window);
-
-      if (context->dest_window)
-       gdk_window_unref (context->dest_window);
-
-      contexts = g_list_remove (contexts, private);
-      g_free (private);
-    }
-}
-
-#if 0
-
-static GdkDragContext *
-gdk_drag_context_find (gboolean is_source,
-                      HWND     source_xid,
-                      HWND     dest_xid)
-{
-  GList *tmp_list = contexts;
-  GdkDragContext *context;
-
-  while (tmp_list)
-    {
-      context = (GdkDragContext *)tmp_list->data;
-
-      if ((!context->is_source == !is_source) &&
-         ((source_xid == None) || (context->source_window &&
-           (GDK_WINDOW_XWINDOW (context->source_window) == source_xid))) &&
-         ((dest_xid == None) || (context->dest_window &&
-           (GDK_WINDOW_XWINDOW (context->dest_window) == dest_xid))))
-       return context;
-      
-      tmp_list = tmp_list->next;
-    }
-
-  return NULL;
-}
-
-#endif
-
 #ifdef _MSC_VER
 
 /* From MS Knowledge Base article Q130698 */
@@ -693,29 +766,32 @@ gdk_drag_begin (GdkWindow     *window,
                GList         *targets)
 {
   GList *tmp_list;
-  GdkDragContext *new_context;
+  source_drag_context *ctx;
   
   g_return_val_if_fail (window != NULL, NULL);
 
   GDK_NOTE (DND, g_print ("gdk_drag_begin\n"));
 
-  new_context = gdk_drag_context_new ();
-  new_context->is_source = TRUE;
-  new_context->source_window = window;
+  ctx = source_context_new ();
+  ctx->context->is_source = TRUE;
+  ctx->context->source_window = window;
   gdk_window_ref (window);
 
   tmp_list = g_list_last (targets);
-  new_context->targets = NULL;
+  ctx->context->targets = NULL;
   while (tmp_list)
     {
-      new_context->targets = g_list_prepend (new_context->targets,
-                                            tmp_list->data);
+      ctx->context->targets = g_list_prepend (ctx->context->targets,
+                                             tmp_list->data);
       tmp_list = tmp_list->prev;
     }
 
-  new_context->actions = 0;
+  ctx->context->actions = 0;
 
-  return new_context;
+#if 0
+  DoDragDrop (...);
+#endif
+  return ctx->context;
 }
 
 guint32
index 7ac8169786d662eb6477c8151c63e029fa89d17f..279e831f559d1acae91183949a6002d362ef704a 100644 (file)
 
 #include <windows.h>
 
-#ifdef HAVE_WINTAB
-#include <wintab.h>
-#endif
-
 #include <objbase.h>
 #include <imm.h>
 
 #include "surrogate-dimm.h"
 #endif
 
+#ifdef HAVE_WINTAB
+#include <wintab.h>
+#endif
+
 #include "gdk.h"
 #include "gdkx.h"
 
@@ -506,14 +506,6 @@ gdk_event_get_graphics_expose (GdkWindow *window)
 #endif
 }
 
-/************************
- * Exposure compression *
- ************************/
-
-/* I don't bother with exposure compression on Win32. Windows compresses
- * WM_PAINT events by itself.
- */
-
 /*************************************************************
  * gdk_event_handler_set:
  *     
@@ -2819,6 +2811,31 @@ build_key_event_state (GdkEvent *event)
     }
 }
 
+static gint
+build_pointer_event_state (MSG *xevent)
+{
+  gint state;
+  
+  state = 0;
+  if (xevent->wParam & MK_CONTROL)
+    state |= GDK_CONTROL_MASK;
+  if (xevent->wParam & MK_LBUTTON)
+    state |= GDK_BUTTON1_MASK;
+  if (xevent->wParam & MK_MBUTTON)
+    state |= GDK_BUTTON2_MASK;
+  if (xevent->wParam & MK_RBUTTON)
+    state |= GDK_BUTTON3_MASK;
+  if (xevent->wParam & MK_SHIFT)
+    state |= GDK_SHIFT_MASK;
+  if (GetKeyState (VK_MENU) < 0)
+    state |= GDK_MOD1_MASK;
+  if (GetKeyState (VK_CAPITAL) & 0x1)
+    state |= GDK_LOCK_MASK;
+
+  return state;
+}
+
+
 static void
 build_keypress_event (GdkWindowPrivate *window_private,
                      GdkEvent         *event,
@@ -3013,11 +3030,18 @@ print_event (GdkEvent *event)
               event->expose.count);
       break;
     case GDK_MOTION_NOTIFY:
+      g_print ("(%.4g,%.4g) %s",
+              event->motion.x, event->motion.y,
+              event->motion.is_hint ? "HINT " : "");
       print_event_state (event->motion.state);
       break;
     case GDK_BUTTON_PRESS:
+    case GDK_2BUTTON_PRESS:
+    case GDK_3BUTTON_PRESS:
     case GDK_BUTTON_RELEASE:
-      g_print ("%d ", event->button.button);
+      g_print ("%d (%.4g,%.4g) ",
+              event->button.button,
+              event->button.x, event->button.y);
       print_event_state (event->button.state);
       break;
     case GDK_KEY_PRESS: 
@@ -3050,7 +3074,6 @@ static void
 synthesize_crossing_events (GdkWindow *window,
                            MSG       *xevent)
 {
-  TRACKMOUSEEVENT tme;
   GdkEvent *event;
   
   /* If we are not using TrackMouseEvent, generate a leave notify
@@ -3128,8 +3151,11 @@ synthesize_crossing_events (GdkWindow *window,
     gdk_window_unref (curWnd);
   curWnd = window;
   gdk_window_ref (curWnd);
+#ifdef USE_TRACKMOUSEEVENT
   if (p_TrackMouseEvent != NULL)
     {
+      TRACKMOUSEEVENT tme;
+
       tme.cbSize = sizeof (TRACKMOUSEEVENT);
       tme.dwFlags = TME_LEAVE;
       tme.hwndTrack = GDK_DRAWABLE_XID (curWnd);
@@ -3137,8 +3163,11 @@ synthesize_crossing_events (GdkWindow *window,
       
       (*p_TrackMouseEvent) (&tme);
     }
+#endif
 }
 
+#ifndef NEW_PROPAGATION_CODE
+
 static GdkWindow *
 key_propagate (GdkWindow *window,
               MSG       *xevent)
@@ -3146,15 +3175,13 @@ key_propagate (GdkWindow *window,
   gdk_window_unref (window);
   window = WINDOW_PRIVATE(window)->parent;
   gdk_window_ref (window);
-  GDK_NOTE (EVENTS, g_print ("...propagating to %#x\n",
-                            GDK_DRAWABLE_XID (window)));
 
   return window;
 }  
 
 static GdkWindow *
-mouse_propagate (GdkWindow *window,
-                MSG       *xevent)
+pointer_propagate (GdkWindow *window,
+                  MSG       *xevent)
 {
   POINT pt;
 
@@ -3166,11 +3193,27 @@ mouse_propagate (GdkWindow *window,
   gdk_window_ref (window);
   ScreenToClient (GDK_DRAWABLE_XID (window), &pt);
   xevent->lParam = MAKELPARAM (pt.x, pt.y);
-  GDK_NOTE (EVENTS, g_print ("...propagating to %#x\n",
-                            GDK_DRAWABLE_XID (window)));
+
   return window;
 }
 
+#endif /* !NEW_PROPAGATION_CODE */
+
+static void
+translate_mouse_coords (GdkWindow *window1,
+                       GdkWindow *window2,
+                       MSG       *xevent)
+{
+  POINT pt;
+
+  pt.x = LOWORD (xevent->lParam);
+  pt.y = HIWORD (xevent->lParam);
+  ClientToScreen (GDK_DRAWABLE_XID (window1), &pt);
+  ScreenToClient (GDK_DRAWABLE_XID (window2), &pt);
+  xevent->lParam = MAKELPARAM (pt.x, pt.y);
+  GDK_NOTE (EVENTS, g_print ("...new coords are (%d,%d)\n", pt.x, pt.y));
+}
+
 #ifdef NEW_PROPAGATION_CODE
 
 static gboolean
@@ -3180,9 +3223,7 @@ propagate (GdkWindow  **window,
           gboolean     grab_owner_events,
           gint         grab_mask,
           gboolean   (*doesnt_want_it) (gint mask,
-                                        MSG *xevent),
-          GdkWindow *(*propagate) (GdkWindow *window,
-                                   MSG       *xevent))
+                                        MSG *xevent))
 {
   if (grab_window != NULL && !grab_owner_events)
     {
@@ -3234,13 +3275,15 @@ propagate (GdkWindow  **window,
                }
              else
                {
-                 GDK_NOTE (EVENTS, "...undelivered\n");
+                 GDK_NOTE (EVENTS, g_print ("...undelivered\n"));
                  return FALSE;
                }
            }
          else
            {
-             *window = (*propagate) (*window, xevent);
+             gdk_window_unref (*window);
+             *window = WINDOW_PRIVATE(*window)->parent;
+             gdk_window_ref (*window);
              GDK_NOTE (EVENTS, g_print ("...propagating to %#x\n",
                                         GDK_DRAWABLE_XID (*window)));
              /* The only branch where we actually continue the loop */
@@ -3539,8 +3582,7 @@ gdk_event_translate (GdkEvent *event,
 #ifdef NEW_PROPAGATION_CODE
       if (!propagate (&window, xevent,
                      k_grab_window, k_grab_owner_events, GDK_ALL_EVENTS_MASK,
-                     doesnt_want_key,
-                     key_propagate))
+                     doesnt_want_key))
          break;
       event->key.window = window;
 #else
@@ -3815,8 +3857,7 @@ gdk_event_translate (GdkEvent *event,
 #ifdef NEW_PROPAGATION_CODE
       if (!propagate (&window, xevent,
                      k_grab_window, k_grab_owner_events, GDK_ALL_EVENTS_MASK,
-                     doesnt_want_char,
-                     key_propagate))
+                     doesnt_want_char))
          break;
       event->key.window = window;
 #else
@@ -3912,11 +3953,10 @@ gdk_event_translate (GdkEvent *event,
 
     buttondown0:
       GDK_NOTE (EVENTS, 
-               g_print ("WM_%cBUTTONDOWN: %#x  x,y: %d %d  button: %d\n",
+               g_print ("WM_%cBUTTONDOWN: %#x  (%d,%d)\n",
                         " LMR"[button],
                         xevent->hwnd,
-                        LOWORD (xevent->lParam), HIWORD (xevent->lParam),
-                        button));
+                        LOWORD (xevent->lParam), HIWORD (xevent->lParam)));
 
       if (WINDOW_PRIVATE(window)->extension_events != 0
          && gdk_input_ignore_core)
@@ -3932,8 +3972,7 @@ gdk_event_translate (GdkEvent *event,
 #ifdef NEW_PROPAGATION_CODE
       if (!propagate (&window, xevent,
                      p_grab_window, p_grab_owner_events, p_grab_mask,
-                     doesnt_want_button_press,
-                     mouse_propagate))
+                     doesnt_want_button_press))
          break;
       event->button.window = window;
 #else
@@ -3981,7 +4020,7 @@ gdk_event_translate (GdkEvent *event,
            }
          else
            {
-             window = mouse_propagate (window, xevent);
+             window = pointer_propagate (window, xevent);
              /* Jump back up */
              goto buttondown; /* What did Dijkstra say? */
            }
@@ -4008,43 +4047,16 @@ gdk_event_translate (GdkEvent *event,
        }
 
       event->button.time = xevent->time;
-      if (window == p_grab_window
-         && p_grab_window != orig_window)
-       {
-         /* Translate coordinates to grabber */
-         pt.x = LOWORD (xevent->lParam);
-         pt.y = HIWORD (xevent->lParam);
-         ClientToScreen (xevent->hwnd, &pt);
-         ScreenToClient (GDK_DRAWABLE_XID (p_grab_window), &pt);
-         event->button.x = pt.x;
-         event->button.y = pt.y;
-         GDK_NOTE (EVENTS, g_print ("...new coords are +%d+%d\n", pt.x, pt.y));
-       }
-      else
-       {
-         event->button.x = LOWORD (xevent->lParam);
-         event->button.y = HIWORD (xevent->lParam);
-       }
+      if (window != orig_window)
+       translate_mouse_coords (orig_window, window, xevent);
+      event->button.x = curX = LOWORD (xevent->lParam);
+      event->button.y = curY = HIWORD (xevent->lParam);
       event->button.x_root = xevent->pt.x;
       event->button.y_root = xevent->pt.y;
       event->button.pressure = 0.5;
       event->button.xtilt = 0;
       event->button.ytilt = 0;
-      event->button.state = 0;
-      if (xevent->wParam & MK_CONTROL)
-       event->button.state |= GDK_CONTROL_MASK;
-      if (xevent->wParam & MK_LBUTTON)
-       event->button.state |= GDK_BUTTON1_MASK;
-      if (xevent->wParam & MK_MBUTTON)
-       event->button.state |= GDK_BUTTON2_MASK;
-      if (xevent->wParam & MK_RBUTTON)
-       event->button.state |= GDK_BUTTON3_MASK;
-      if (xevent->wParam & MK_SHIFT)
-       event->button.state |= GDK_SHIFT_MASK;
-      if (GetKeyState (VK_MENU) < 0)
-       event->button.state |= GDK_MOD1_MASK;
-      if (GetKeyState (VK_CAPITAL) & 0x1)
-       event->button.state |= GDK_LOCK_MASK;
+      event->button.state = build_pointer_event_state (xevent);
       event->button.button = button;
       event->button.source = GDK_SOURCE_MOUSE;
       event->button.deviceid = GDK_CORE_POINTER;
@@ -4098,11 +4110,10 @@ gdk_event_translate (GdkEvent *event,
 
     buttonup0:
       GDK_NOTE (EVENTS, 
-               g_print ("WM_%cBUTTONUP: %#x  x,y: %d %d  button: %d\n",
+               g_print ("WM_%cBUTTONUP: %#x  (%d,%d)\n",
                         " LMR"[button],
                         xevent->hwnd,
-                        LOWORD (xevent->lParam), HIWORD (xevent->lParam),
-                        button));
+                        LOWORD (xevent->lParam), HIWORD (xevent->lParam)));
 
       if (WINDOW_PRIVATE(window)->extension_events != 0
          && gdk_input_ignore_core)
@@ -4118,9 +4129,8 @@ gdk_event_translate (GdkEvent *event,
 #ifdef NEW_PROPAGATION_CODE
       if (!propagate (&window, xevent,
                      p_grab_window, p_grab_owner_events, p_grab_mask,
-                     doesnt_want_button_release,
-                     mouse_propagate))
-         break;
+                     doesnt_want_button_release))
+         goto maybe_ungrab;
       event->button.window = window;
 #else
     buttonup:
@@ -4168,7 +4178,7 @@ gdk_event_translate (GdkEvent *event,
            }
          else
            {
-             window = mouse_propagate (window, xevent);
+             window = pointer_propagate (window, xevent);
              /* Jump back up */
              goto buttonup;
            }
@@ -4179,43 +4189,16 @@ gdk_event_translate (GdkEvent *event,
       g_assert (event->button.window == window);
 #endif
       event->button.time = xevent->time;
-      if (window == p_grab_window
-         && p_grab_window != orig_window)
-       {
-         /* Translate coordinates to grabber */
-         pt.x = LOWORD (xevent->lParam);
-         pt.y = HIWORD (xevent->lParam);
-         ClientToScreen (xevent->hwnd, &pt);
-         ScreenToClient (GDK_DRAWABLE_XID (p_grab_window), &pt);
-         event->button.x = pt.x;
-         event->button.y = pt.y;
-         GDK_NOTE (EVENTS, g_print ("...new coords are +%d+%d\n", pt.x, pt.y));
-       }
-      else
-       {
-         event->button.x = LOWORD (xevent->lParam);
-         event->button.y = HIWORD (xevent->lParam);
-       }
+      if (window != orig_window)
+       translate_mouse_coords (orig_window, window, xevent);
+      event->button.x = LOWORD (xevent->lParam);
+      event->button.y = HIWORD (xevent->lParam);
       event->button.x_root = xevent->pt.x;
       event->button.y_root = xevent->pt.y;
       event->button.pressure = 0.5;
       event->button.xtilt = 0;
       event->button.ytilt = 0;
-      event->button.state = 0;
-      if (xevent->wParam & MK_CONTROL)
-       event->button.state |= GDK_CONTROL_MASK;
-      if (xevent->wParam & MK_LBUTTON)
-       event->button.state |= GDK_BUTTON1_MASK;
-      if (xevent->wParam & MK_MBUTTON)
-       event->button.state |= GDK_BUTTON2_MASK;
-      if (xevent->wParam & MK_RBUTTON)
-       event->button.state |= GDK_BUTTON3_MASK;
-      if (xevent->wParam & MK_SHIFT)
-       event->button.state |= GDK_SHIFT_MASK;
-      if (GetKeyState (VK_MENU) < 0)
-       event->button.state |= GDK_MOD1_MASK;
-      if (GetKeyState (VK_CAPITAL) & 0x1)
-       event->button.state |= GDK_LOCK_MASK;
+      event->button.state = build_pointer_event_state (xevent);
       event->button.button = button;
       event->button.source = GDK_SOURCE_MOUSE;
       event->button.deviceid = GDK_CORE_POINTER;
@@ -4231,12 +4214,20 @@ gdk_event_translate (GdkEvent *event,
 
     case WM_MOUSEMOVE:
       GDK_NOTE (EVENTS,
-               g_print ("WM_MOUSEMOVE: %#x  %#x +%d+%d\n",
+               g_print ("WM_MOUSEMOVE: %#x  %#x (%d,%d)\n",
                         xevent->hwnd, xevent->wParam,
                         LOWORD (xevent->lParam), HIWORD (xevent->lParam)));
 
-      /* HB: only process mouse move messages if we own the active window. */
+      /* If we haven't moved, don't create any event.
+       * Windows sends WM_MOUSEMOVE messages after button presses
+       * even if the mouse doesn't move. This disturbs gtk.
+       */
+      if (window == curWnd
+         && LOWORD (xevent->lParam) == curX
+         && HIWORD (xevent->lParam) == curY)
+       break;
 
+      /* HB: only process mouse move messages if we own the active window. */
       GetWindowThreadProcessId(GetActiveWindow(), &pidActWin);
       GetWindowThreadProcessId(xevent->hwnd, &pidThis);
       if (pidActWin != pidThis)
@@ -4256,8 +4247,7 @@ gdk_event_translate (GdkEvent *event,
 #ifdef NEW_PROPAGATION_CODE
       if (!propagate (&window, xevent,
                      p_grab_window, p_grab_owner_events, p_grab_mask,
-                     doesnt_want_button_motion,
-                     mouse_propagate))
+                     doesnt_want_button_motion))
          break;
       event->motion.window = window;
 #else
@@ -4330,7 +4320,7 @@ gdk_event_translate (GdkEvent *event,
            }
          else
            {
-             window = mouse_propagate (window, xevent);
+             window = pointer_propagate (window, xevent);
              /* Jump back up */
              goto mousemotion;
            }
@@ -4339,23 +4329,10 @@ gdk_event_translate (GdkEvent *event,
        event->motion.window = window;
 #endif
       event->motion.time = xevent->time;
-      if (window == p_grab_window
-         && p_grab_window != orig_window)
-       {
-         /* Translate coordinates to grabber */
-         pt.x = curX = LOWORD (xevent->lParam);
-         pt.y = curY = HIWORD (xevent->lParam);
-         ClientToScreen (xevent->hwnd, &pt);
-         ScreenToClient (GDK_DRAWABLE_XID (p_grab_window), &pt);
-         event->motion.x = pt.x;
-         event->motion.y = pt.y;
-         GDK_NOTE (EVENTS, g_print ("...new coords are +%d+%d\n", pt.x, pt.y));
-       }
-      else
-       {
-         event->motion.x = curX = LOWORD (xevent->lParam);
-         event->motion.y = curY = HIWORD (xevent->lParam);
-       }
+      if (window != orig_window)
+       translate_mouse_coords (orig_window, window, xevent);
+      event->motion.x = curX = LOWORD (xevent->lParam);
+      event->motion.y = curY = HIWORD (xevent->lParam);
       event->motion.x_root = xevent->pt.x;
       event->motion.y_root = xevent->pt.y;
       curXroot = event->motion.x_root;
@@ -4363,25 +4340,8 @@ gdk_event_translate (GdkEvent *event,
       event->motion.pressure = 0.5;
       event->motion.xtilt = 0;
       event->motion.ytilt = 0;
-      event->button.state = 0;
-      if (xevent->wParam & MK_CONTROL)
-       event->button.state |= GDK_CONTROL_MASK;
-      if (xevent->wParam & MK_LBUTTON)
-       event->button.state |= GDK_BUTTON1_MASK;
-      if (xevent->wParam & MK_MBUTTON)
-       event->button.state |= GDK_BUTTON2_MASK;
-      if (xevent->wParam & MK_RBUTTON)
-       event->button.state |= GDK_BUTTON3_MASK;
-      if (xevent->wParam & MK_SHIFT)
-       event->button.state |= GDK_SHIFT_MASK;
-      if (GetKeyState (VK_MENU) < 0)
-       event->button.state |= GDK_MOD1_MASK;
-      if (GetKeyState (VK_CAPITAL) & 0x1)
-       event->button.state |= GDK_LOCK_MASK;
-      if (mask & GDK_POINTER_MOTION_HINT_MASK)
-       event->motion.is_hint = NotifyHint;
-      else
-       event->motion.is_hint = NotifyNormal;
+      event->motion.state = build_pointer_event_state (xevent);
+      event->motion.is_hint = FALSE;
       event->motion.source = GDK_SOURCE_MOUSE;
       event->motion.deviceid = GDK_CORE_POINTER;
 
@@ -4788,7 +4748,7 @@ gdk_event_translate (GdkEvent *event,
       break;
 
     case WM_MOVE:
-      GDK_NOTE (EVENTS, g_print ("WM_MOVE: %#x  +%d+%d\n",
+      GDK_NOTE (EVENTS, g_print ("WM_MOVE: %#x  (%d,%d)\n",
                                 xevent->hwnd,
                                 LOWORD (xevent->lParam), HIWORD (xevent->lParam)));
 
index 7ac8169786d662eb6477c8151c63e029fa89d17f..279e831f559d1acae91183949a6002d362ef704a 100644 (file)
 
 #include <windows.h>
 
-#ifdef HAVE_WINTAB
-#include <wintab.h>
-#endif
-
 #include <objbase.h>
 #include <imm.h>
 
 #include "surrogate-dimm.h"
 #endif
 
+#ifdef HAVE_WINTAB
+#include <wintab.h>
+#endif
+
 #include "gdk.h"
 #include "gdkx.h"
 
@@ -506,14 +506,6 @@ gdk_event_get_graphics_expose (GdkWindow *window)
 #endif
 }
 
-/************************
- * Exposure compression *
- ************************/
-
-/* I don't bother with exposure compression on Win32. Windows compresses
- * WM_PAINT events by itself.
- */
-
 /*************************************************************
  * gdk_event_handler_set:
  *     
@@ -2819,6 +2811,31 @@ build_key_event_state (GdkEvent *event)
     }
 }
 
+static gint
+build_pointer_event_state (MSG *xevent)
+{
+  gint state;
+  
+  state = 0;
+  if (xevent->wParam & MK_CONTROL)
+    state |= GDK_CONTROL_MASK;
+  if (xevent->wParam & MK_LBUTTON)
+    state |= GDK_BUTTON1_MASK;
+  if (xevent->wParam & MK_MBUTTON)
+    state |= GDK_BUTTON2_MASK;
+  if (xevent->wParam & MK_RBUTTON)
+    state |= GDK_BUTTON3_MASK;
+  if (xevent->wParam & MK_SHIFT)
+    state |= GDK_SHIFT_MASK;
+  if (GetKeyState (VK_MENU) < 0)
+    state |= GDK_MOD1_MASK;
+  if (GetKeyState (VK_CAPITAL) & 0x1)
+    state |= GDK_LOCK_MASK;
+
+  return state;
+}
+
+
 static void
 build_keypress_event (GdkWindowPrivate *window_private,
                      GdkEvent         *event,
@@ -3013,11 +3030,18 @@ print_event (GdkEvent *event)
               event->expose.count);
       break;
     case GDK_MOTION_NOTIFY:
+      g_print ("(%.4g,%.4g) %s",
+              event->motion.x, event->motion.y,
+              event->motion.is_hint ? "HINT " : "");
       print_event_state (event->motion.state);
       break;
     case GDK_BUTTON_PRESS:
+    case GDK_2BUTTON_PRESS:
+    case GDK_3BUTTON_PRESS:
     case GDK_BUTTON_RELEASE:
-      g_print ("%d ", event->button.button);
+      g_print ("%d (%.4g,%.4g) ",
+              event->button.button,
+              event->button.x, event->button.y);
       print_event_state (event->button.state);
       break;
     case GDK_KEY_PRESS: 
@@ -3050,7 +3074,6 @@ static void
 synthesize_crossing_events (GdkWindow *window,
                            MSG       *xevent)
 {
-  TRACKMOUSEEVENT tme;
   GdkEvent *event;
   
   /* If we are not using TrackMouseEvent, generate a leave notify
@@ -3128,8 +3151,11 @@ synthesize_crossing_events (GdkWindow *window,
     gdk_window_unref (curWnd);
   curWnd = window;
   gdk_window_ref (curWnd);
+#ifdef USE_TRACKMOUSEEVENT
   if (p_TrackMouseEvent != NULL)
     {
+      TRACKMOUSEEVENT tme;
+
       tme.cbSize = sizeof (TRACKMOUSEEVENT);
       tme.dwFlags = TME_LEAVE;
       tme.hwndTrack = GDK_DRAWABLE_XID (curWnd);
@@ -3137,8 +3163,11 @@ synthesize_crossing_events (GdkWindow *window,
       
       (*p_TrackMouseEvent) (&tme);
     }
+#endif
 }
 
+#ifndef NEW_PROPAGATION_CODE
+
 static GdkWindow *
 key_propagate (GdkWindow *window,
               MSG       *xevent)
@@ -3146,15 +3175,13 @@ key_propagate (GdkWindow *window,
   gdk_window_unref (window);
   window = WINDOW_PRIVATE(window)->parent;
   gdk_window_ref (window);
-  GDK_NOTE (EVENTS, g_print ("...propagating to %#x\n",
-                            GDK_DRAWABLE_XID (window)));
 
   return window;
 }  
 
 static GdkWindow *
-mouse_propagate (GdkWindow *window,
-                MSG       *xevent)
+pointer_propagate (GdkWindow *window,
+                  MSG       *xevent)
 {
   POINT pt;
 
@@ -3166,11 +3193,27 @@ mouse_propagate (GdkWindow *window,
   gdk_window_ref (window);
   ScreenToClient (GDK_DRAWABLE_XID (window), &pt);
   xevent->lParam = MAKELPARAM (pt.x, pt.y);
-  GDK_NOTE (EVENTS, g_print ("...propagating to %#x\n",
-                            GDK_DRAWABLE_XID (window)));
+
   return window;
 }
 
+#endif /* !NEW_PROPAGATION_CODE */
+
+static void
+translate_mouse_coords (GdkWindow *window1,
+                       GdkWindow *window2,
+                       MSG       *xevent)
+{
+  POINT pt;
+
+  pt.x = LOWORD (xevent->lParam);
+  pt.y = HIWORD (xevent->lParam);
+  ClientToScreen (GDK_DRAWABLE_XID (window1), &pt);
+  ScreenToClient (GDK_DRAWABLE_XID (window2), &pt);
+  xevent->lParam = MAKELPARAM (pt.x, pt.y);
+  GDK_NOTE (EVENTS, g_print ("...new coords are (%d,%d)\n", pt.x, pt.y));
+}
+
 #ifdef NEW_PROPAGATION_CODE
 
 static gboolean
@@ -3180,9 +3223,7 @@ propagate (GdkWindow  **window,
           gboolean     grab_owner_events,
           gint         grab_mask,
           gboolean   (*doesnt_want_it) (gint mask,
-                                        MSG *xevent),
-          GdkWindow *(*propagate) (GdkWindow *window,
-                                   MSG       *xevent))
+                                        MSG *xevent))
 {
   if (grab_window != NULL && !grab_owner_events)
     {
@@ -3234,13 +3275,15 @@ propagate (GdkWindow  **window,
                }
              else
                {
-                 GDK_NOTE (EVENTS, "...undelivered\n");
+                 GDK_NOTE (EVENTS, g_print ("...undelivered\n"));
                  return FALSE;
                }
            }
          else
            {
-             *window = (*propagate) (*window, xevent);
+             gdk_window_unref (*window);
+             *window = WINDOW_PRIVATE(*window)->parent;
+             gdk_window_ref (*window);
              GDK_NOTE (EVENTS, g_print ("...propagating to %#x\n",
                                         GDK_DRAWABLE_XID (*window)));
              /* The only branch where we actually continue the loop */
@@ -3539,8 +3582,7 @@ gdk_event_translate (GdkEvent *event,
 #ifdef NEW_PROPAGATION_CODE
       if (!propagate (&window, xevent,
                      k_grab_window, k_grab_owner_events, GDK_ALL_EVENTS_MASK,
-                     doesnt_want_key,
-                     key_propagate))
+                     doesnt_want_key))
          break;
       event->key.window = window;
 #else
@@ -3815,8 +3857,7 @@ gdk_event_translate (GdkEvent *event,
 #ifdef NEW_PROPAGATION_CODE
       if (!propagate (&window, xevent,
                      k_grab_window, k_grab_owner_events, GDK_ALL_EVENTS_MASK,
-                     doesnt_want_char,
-                     key_propagate))
+                     doesnt_want_char))
          break;
       event->key.window = window;
 #else
@@ -3912,11 +3953,10 @@ gdk_event_translate (GdkEvent *event,
 
     buttondown0:
       GDK_NOTE (EVENTS, 
-               g_print ("WM_%cBUTTONDOWN: %#x  x,y: %d %d  button: %d\n",
+               g_print ("WM_%cBUTTONDOWN: %#x  (%d,%d)\n",
                         " LMR"[button],
                         xevent->hwnd,
-                        LOWORD (xevent->lParam), HIWORD (xevent->lParam),
-                        button));
+                        LOWORD (xevent->lParam), HIWORD (xevent->lParam)));
 
       if (WINDOW_PRIVATE(window)->extension_events != 0
          && gdk_input_ignore_core)
@@ -3932,8 +3972,7 @@ gdk_event_translate (GdkEvent *event,
 #ifdef NEW_PROPAGATION_CODE
       if (!propagate (&window, xevent,
                      p_grab_window, p_grab_owner_events, p_grab_mask,
-                     doesnt_want_button_press,
-                     mouse_propagate))
+                     doesnt_want_button_press))
          break;
       event->button.window = window;
 #else
@@ -3981,7 +4020,7 @@ gdk_event_translate (GdkEvent *event,
            }
          else
            {
-             window = mouse_propagate (window, xevent);
+             window = pointer_propagate (window, xevent);
              /* Jump back up */
              goto buttondown; /* What did Dijkstra say? */
            }
@@ -4008,43 +4047,16 @@ gdk_event_translate (GdkEvent *event,
        }
 
       event->button.time = xevent->time;
-      if (window == p_grab_window
-         && p_grab_window != orig_window)
-       {
-         /* Translate coordinates to grabber */
-         pt.x = LOWORD (xevent->lParam);
-         pt.y = HIWORD (xevent->lParam);
-         ClientToScreen (xevent->hwnd, &pt);
-         ScreenToClient (GDK_DRAWABLE_XID (p_grab_window), &pt);
-         event->button.x = pt.x;
-         event->button.y = pt.y;
-         GDK_NOTE (EVENTS, g_print ("...new coords are +%d+%d\n", pt.x, pt.y));
-       }
-      else
-       {
-         event->button.x = LOWORD (xevent->lParam);
-         event->button.y = HIWORD (xevent->lParam);
-       }
+      if (window != orig_window)
+       translate_mouse_coords (orig_window, window, xevent);
+      event->button.x = curX = LOWORD (xevent->lParam);
+      event->button.y = curY = HIWORD (xevent->lParam);
       event->button.x_root = xevent->pt.x;
       event->button.y_root = xevent->pt.y;
       event->button.pressure = 0.5;
       event->button.xtilt = 0;
       event->button.ytilt = 0;
-      event->button.state = 0;
-      if (xevent->wParam & MK_CONTROL)
-       event->button.state |= GDK_CONTROL_MASK;
-      if (xevent->wParam & MK_LBUTTON)
-       event->button.state |= GDK_BUTTON1_MASK;
-      if (xevent->wParam & MK_MBUTTON)
-       event->button.state |= GDK_BUTTON2_MASK;
-      if (xevent->wParam & MK_RBUTTON)
-       event->button.state |= GDK_BUTTON3_MASK;
-      if (xevent->wParam & MK_SHIFT)
-       event->button.state |= GDK_SHIFT_MASK;
-      if (GetKeyState (VK_MENU) < 0)
-       event->button.state |= GDK_MOD1_MASK;
-      if (GetKeyState (VK_CAPITAL) & 0x1)
-       event->button.state |= GDK_LOCK_MASK;
+      event->button.state = build_pointer_event_state (xevent);
       event->button.button = button;
       event->button.source = GDK_SOURCE_MOUSE;
       event->button.deviceid = GDK_CORE_POINTER;
@@ -4098,11 +4110,10 @@ gdk_event_translate (GdkEvent *event,
 
     buttonup0:
       GDK_NOTE (EVENTS, 
-               g_print ("WM_%cBUTTONUP: %#x  x,y: %d %d  button: %d\n",
+               g_print ("WM_%cBUTTONUP: %#x  (%d,%d)\n",
                         " LMR"[button],
                         xevent->hwnd,
-                        LOWORD (xevent->lParam), HIWORD (xevent->lParam),
-                        button));
+                        LOWORD (xevent->lParam), HIWORD (xevent->lParam)));
 
       if (WINDOW_PRIVATE(window)->extension_events != 0
          && gdk_input_ignore_core)
@@ -4118,9 +4129,8 @@ gdk_event_translate (GdkEvent *event,
 #ifdef NEW_PROPAGATION_CODE
       if (!propagate (&window, xevent,
                      p_grab_window, p_grab_owner_events, p_grab_mask,
-                     doesnt_want_button_release,
-                     mouse_propagate))
-         break;
+                     doesnt_want_button_release))
+         goto maybe_ungrab;
       event->button.window = window;
 #else
     buttonup:
@@ -4168,7 +4178,7 @@ gdk_event_translate (GdkEvent *event,
            }
          else
            {
-             window = mouse_propagate (window, xevent);
+             window = pointer_propagate (window, xevent);
              /* Jump back up */
              goto buttonup;
            }
@@ -4179,43 +4189,16 @@ gdk_event_translate (GdkEvent *event,
       g_assert (event->button.window == window);
 #endif
       event->button.time = xevent->time;
-      if (window == p_grab_window
-         && p_grab_window != orig_window)
-       {
-         /* Translate coordinates to grabber */
-         pt.x = LOWORD (xevent->lParam);
-         pt.y = HIWORD (xevent->lParam);
-         ClientToScreen (xevent->hwnd, &pt);
-         ScreenToClient (GDK_DRAWABLE_XID (p_grab_window), &pt);
-         event->button.x = pt.x;
-         event->button.y = pt.y;
-         GDK_NOTE (EVENTS, g_print ("...new coords are +%d+%d\n", pt.x, pt.y));
-       }
-      else
-       {
-         event->button.x = LOWORD (xevent->lParam);
-         event->button.y = HIWORD (xevent->lParam);
-       }
+      if (window != orig_window)
+       translate_mouse_coords (orig_window, window, xevent);
+      event->button.x = LOWORD (xevent->lParam);
+      event->button.y = HIWORD (xevent->lParam);
       event->button.x_root = xevent->pt.x;
       event->button.y_root = xevent->pt.y;
       event->button.pressure = 0.5;
       event->button.xtilt = 0;
       event->button.ytilt = 0;
-      event->button.state = 0;
-      if (xevent->wParam & MK_CONTROL)
-       event->button.state |= GDK_CONTROL_MASK;
-      if (xevent->wParam & MK_LBUTTON)
-       event->button.state |= GDK_BUTTON1_MASK;
-      if (xevent->wParam & MK_MBUTTON)
-       event->button.state |= GDK_BUTTON2_MASK;
-      if (xevent->wParam & MK_RBUTTON)
-       event->button.state |= GDK_BUTTON3_MASK;
-      if (xevent->wParam & MK_SHIFT)
-       event->button.state |= GDK_SHIFT_MASK;
-      if (GetKeyState (VK_MENU) < 0)
-       event->button.state |= GDK_MOD1_MASK;
-      if (GetKeyState (VK_CAPITAL) & 0x1)
-       event->button.state |= GDK_LOCK_MASK;
+      event->button.state = build_pointer_event_state (xevent);
       event->button.button = button;
       event->button.source = GDK_SOURCE_MOUSE;
       event->button.deviceid = GDK_CORE_POINTER;
@@ -4231,12 +4214,20 @@ gdk_event_translate (GdkEvent *event,
 
     case WM_MOUSEMOVE:
       GDK_NOTE (EVENTS,
-               g_print ("WM_MOUSEMOVE: %#x  %#x +%d+%d\n",
+               g_print ("WM_MOUSEMOVE: %#x  %#x (%d,%d)\n",
                         xevent->hwnd, xevent->wParam,
                         LOWORD (xevent->lParam), HIWORD (xevent->lParam)));
 
-      /* HB: only process mouse move messages if we own the active window. */
+      /* If we haven't moved, don't create any event.
+       * Windows sends WM_MOUSEMOVE messages after button presses
+       * even if the mouse doesn't move. This disturbs gtk.
+       */
+      if (window == curWnd
+         && LOWORD (xevent->lParam) == curX
+         && HIWORD (xevent->lParam) == curY)
+       break;
 
+      /* HB: only process mouse move messages if we own the active window. */
       GetWindowThreadProcessId(GetActiveWindow(), &pidActWin);
       GetWindowThreadProcessId(xevent->hwnd, &pidThis);
       if (pidActWin != pidThis)
@@ -4256,8 +4247,7 @@ gdk_event_translate (GdkEvent *event,
 #ifdef NEW_PROPAGATION_CODE
       if (!propagate (&window, xevent,
                      p_grab_window, p_grab_owner_events, p_grab_mask,
-                     doesnt_want_button_motion,
-                     mouse_propagate))
+                     doesnt_want_button_motion))
          break;
       event->motion.window = window;
 #else
@@ -4330,7 +4320,7 @@ gdk_event_translate (GdkEvent *event,
            }
          else
            {
-             window = mouse_propagate (window, xevent);
+             window = pointer_propagate (window, xevent);
              /* Jump back up */
              goto mousemotion;
            }
@@ -4339,23 +4329,10 @@ gdk_event_translate (GdkEvent *event,
        event->motion.window = window;
 #endif
       event->motion.time = xevent->time;
-      if (window == p_grab_window
-         && p_grab_window != orig_window)
-       {
-         /* Translate coordinates to grabber */
-         pt.x = curX = LOWORD (xevent->lParam);
-         pt.y = curY = HIWORD (xevent->lParam);
-         ClientToScreen (xevent->hwnd, &pt);
-         ScreenToClient (GDK_DRAWABLE_XID (p_grab_window), &pt);
-         event->motion.x = pt.x;
-         event->motion.y = pt.y;
-         GDK_NOTE (EVENTS, g_print ("...new coords are +%d+%d\n", pt.x, pt.y));
-       }
-      else
-       {
-         event->motion.x = curX = LOWORD (xevent->lParam);
-         event->motion.y = curY = HIWORD (xevent->lParam);
-       }
+      if (window != orig_window)
+       translate_mouse_coords (orig_window, window, xevent);
+      event->motion.x = curX = LOWORD (xevent->lParam);
+      event->motion.y = curY = HIWORD (xevent->lParam);
       event->motion.x_root = xevent->pt.x;
       event->motion.y_root = xevent->pt.y;
       curXroot = event->motion.x_root;
@@ -4363,25 +4340,8 @@ gdk_event_translate (GdkEvent *event,
       event->motion.pressure = 0.5;
       event->motion.xtilt = 0;
       event->motion.ytilt = 0;
-      event->button.state = 0;
-      if (xevent->wParam & MK_CONTROL)
-       event->button.state |= GDK_CONTROL_MASK;
-      if (xevent->wParam & MK_LBUTTON)
-       event->button.state |= GDK_BUTTON1_MASK;
-      if (xevent->wParam & MK_MBUTTON)
-       event->button.state |= GDK_BUTTON2_MASK;
-      if (xevent->wParam & MK_RBUTTON)
-       event->button.state |= GDK_BUTTON3_MASK;
-      if (xevent->wParam & MK_SHIFT)
-       event->button.state |= GDK_SHIFT_MASK;
-      if (GetKeyState (VK_MENU) < 0)
-       event->button.state |= GDK_MOD1_MASK;
-      if (GetKeyState (VK_CAPITAL) & 0x1)
-       event->button.state |= GDK_LOCK_MASK;
-      if (mask & GDK_POINTER_MOTION_HINT_MASK)
-       event->motion.is_hint = NotifyHint;
-      else
-       event->motion.is_hint = NotifyNormal;
+      event->motion.state = build_pointer_event_state (xevent);
+      event->motion.is_hint = FALSE;
       event->motion.source = GDK_SOURCE_MOUSE;
       event->motion.deviceid = GDK_CORE_POINTER;
 
@@ -4788,7 +4748,7 @@ gdk_event_translate (GdkEvent *event,
       break;
 
     case WM_MOVE:
-      GDK_NOTE (EVENTS, g_print ("WM_MOVE: %#x  +%d+%d\n",
+      GDK_NOTE (EVENTS, g_print ("WM_MOVE: %#x  (%d,%d)\n",
                                 xevent->hwnd,
                                 LOWORD (xevent->lParam), HIWORD (xevent->lParam)));
 
index 5c85d476a174e9fd520168631566f1d31811899b..59791945ba4706ca11b160664082eaa45e5170ef 100644 (file)
@@ -451,7 +451,11 @@ gdk_font_load_internal (GdkFontType  type,
 GdkFont*
 gdk_font_load (const gchar *font_name)
 {
-  return gdk_font_load_internal (GDK_FONT_FONT, font_name);
+  /* Load all fonts as fontsets... Gtktext and gtkentry work better
+   * that way, they use wide chars, which is necessary for non-ASCII
+   * chars to work. (Yes, even Latin-1, as we use Unicode internally.)
+   */
+  return gdk_font_load_internal (GDK_FONT_FONTSET, font_name);
 }
 
 GdkFont*
index 5c85d476a174e9fd520168631566f1d31811899b..59791945ba4706ca11b160664082eaa45e5170ef 100644 (file)
@@ -451,7 +451,11 @@ gdk_font_load_internal (GdkFontType  type,
 GdkFont*
 gdk_font_load (const gchar *font_name)
 {
-  return gdk_font_load_internal (GDK_FONT_FONT, font_name);
+  /* Load all fonts as fontsets... Gtktext and gtkentry work better
+   * that way, they use wide chars, which is necessary for non-ASCII
+   * chars to work. (Yes, even Latin-1, as we use Unicode internally.)
+   */
+  return gdk_font_load_internal (GDK_FONT_FONTSET, font_name);
 }
 
 GdkFont*
index 3aa73b6076091a86e021056c6a58694f5360b318..9946f23eb8a97bdbf47bc1e97ef0b04f80e877da 100644 (file)
@@ -48,5 +48,4 @@ gint              gdk_null_window_warnings = TRUE;
 
 GMutex *gdk_threads_mutex = NULL;          /* Global GDK lock */
 
-BOOL (WINAPI *p_TrackMouseEvent) (TRACKMOUSEEVENT *tme) = NULL;
-
+PFN_TrackMouseEvent p_TrackMouseEvent = NULL;
index 3aa73b6076091a86e021056c6a58694f5360b318..9946f23eb8a97bdbf47bc1e97ef0b04f80e877da 100644 (file)
@@ -48,5 +48,4 @@ gint              gdk_null_window_warnings = TRUE;
 
 GMutex *gdk_threads_mutex = NULL;          /* Global GDK lock */
 
-BOOL (WINAPI *p_TrackMouseEvent) (TRACKMOUSEEVENT *tme) = NULL;
-
+PFN_TrackMouseEvent p_TrackMouseEvent = NULL;
index 25ed2e071fe5d9c86452e7f6e7abb675382d5e11..e65d3b0e099c19df3a867feb33e9a94a55d2f1d1 100644 (file)
@@ -29,6 +29,7 @@
 
 #define STRICT                 /* We want strict type checks */
 #include <windows.h>
+#include <commctrl.h>
 
 /* Make up for some minor mingw32 lossage */
 
@@ -113,10 +114,6 @@ typedef int Status;
 #define AllocNone 0
 #define AllocAll 1
 
-/* Notify modes */
-#define NotifyNormal 0
-#define NotifyHint 1
-
 /* Some structs are somewhat useful to emulate internally, just to
    keep the code less #ifdefed.  */
 typedef struct {
@@ -422,7 +419,9 @@ extern UINT          gdk_selection_clear_msg;
 extern GdkAtom          gdk_clipboard_atom;
 extern GdkAtom          gdk_win32_dropfiles_atom;
 extern GdkAtom          gdk_ole2_dnd_atom;
-extern BOOL (WINAPI *p_TrackMouseEvent) (TRACKMOUSEEVENT *tme);
+
+typedef BOOL (WINAPI *PFN_TrackMouseEvent) (LPTRACKMOUSEEVENT);
+extern PFN_TrackMouseEvent p_TrackMouseEvent;
 
 extern LRESULT CALLBACK gdk_WindowProc (HWND, UINT, WPARAM, LPARAM);
 
index 25ed2e071fe5d9c86452e7f6e7abb675382d5e11..e65d3b0e099c19df3a867feb33e9a94a55d2f1d1 100644 (file)
@@ -29,6 +29,7 @@
 
 #define STRICT                 /* We want strict type checks */
 #include <windows.h>
+#include <commctrl.h>
 
 /* Make up for some minor mingw32 lossage */
 
@@ -113,10 +114,6 @@ typedef int Status;
 #define AllocNone 0
 #define AllocAll 1
 
-/* Notify modes */
-#define NotifyNormal 0
-#define NotifyHint 1
-
 /* Some structs are somewhat useful to emulate internally, just to
    keep the code less #ifdefed.  */
 typedef struct {
@@ -422,7 +419,9 @@ extern UINT          gdk_selection_clear_msg;
 extern GdkAtom          gdk_clipboard_atom;
 extern GdkAtom          gdk_win32_dropfiles_atom;
 extern GdkAtom          gdk_ole2_dnd_atom;
-extern BOOL (WINAPI *p_TrackMouseEvent) (TRACKMOUSEEVENT *tme);
+
+typedef BOOL (WINAPI *PFN_TrackMouseEvent) (LPTRACKMOUSEEVENT);
+extern PFN_TrackMouseEvent p_TrackMouseEvent;
 
 extern LRESULT CALLBACK gdk_WindowProc (HWND, UINT, WPARAM, LPARAM);
 
index 0d2a5b056e38859b30caa0042c05be8f361552d6..d8b5177acf8a36917f30fc64c1fdf80b64266fab 100644 (file)
@@ -421,10 +421,11 @@ gdk_window_new (GdkWindow     *parent,
                        TCI_SRCCODEPAGE);
 
   titlelen = strlen (title);
-  wctitle = g_new (wchar_t, titlelen);
+  wctitle = g_new (wchar_t, titlelen + 1);
   mbtitle = g_new (char, 3*titlelen + 1);
   wlen = gdk_nmbstowchar_ts (wctitle, title, titlelen, titlelen);
-  WideCharToMultiByte (GetACP (), 0, wctitle, wlen,
+  wctitle[wlen] = 0;
+  WideCharToMultiByte (GetACP (), 0, wctitle, -1,
                       mbtitle, 3*titlelen, NULL, NULL);
   
   private->drawable.xwindow =
@@ -439,16 +440,6 @@ gdk_window_new (GdkWindow     *parent,
                    gdk_ProgInstance,
                    NULL);
 
-  g_free (mbtitle);
-  g_free (wctitle);
-
-  if (private->drawable.xwindow == NULL)
-    {
-      g_warning ("gdk_window_create: CreateWindowEx failed");
-      g_free (private);
-      return NULL;
-    }
-
   GDK_NOTE (MISC,
            g_print ("gdk_window_create: %s %s %dx%d@+%d+%d %#x = %#x\n"
                     "...locale %#x codepage %d\n",
@@ -457,13 +448,23 @@ gdk_window_new (GdkWindow     *parent,
                       (private->drawable.window_type == GDK_WINDOW_DIALOG ? "DIALOG" :
                        (private->drawable.window_type == GDK_WINDOW_TEMP ? "TEMP" :
                         "???")))),
-                    title,
+                    mbtitle,
                     width, height, (x == CW_USEDEFAULT ? -9999 : x), y, 
                     xparent,
                     private->drawable.xwindow,
                     private->input_locale,
                     private->charset_info.ciACP));
 
+  g_free (mbtitle);
+  g_free (wctitle);
+
+  if (private->drawable.xwindow == NULL)
+    {
+      g_warning ("gdk_window_create: CreateWindowEx failed");
+      g_free (private);
+      return NULL;
+    }
+
   gdk_window_ref (window);
   gdk_xid_table_insert (&private->drawable.xwindow, window);
 
@@ -1413,10 +1414,11 @@ gdk_window_set_title (GdkWindow   *window,
        * to the system codepage.
        */
       titlelen = strlen (title);
-      wcstr = g_new (wchar_t, titlelen);
+      wcstr = g_new (wchar_t, titlelen + 1);
       mbstr = g_new (char, 3*titlelen + 1);
       wlen = gdk_nmbstowchar_ts (wcstr, title, titlelen, titlelen);
-      WideCharToMultiByte (GetACP (), 0, wcstr, wlen,
+      wcstr[wlen] = 0;
+      WideCharToMultiByte (GetACP (), 0, wcstr, -1,
                           mbstr, 3*titlelen, NULL, NULL);
 
       if (!SetWindowText (GDK_DRAWABLE_XID (window), mbstr))
index 0d2a5b056e38859b30caa0042c05be8f361552d6..d8b5177acf8a36917f30fc64c1fdf80b64266fab 100644 (file)
@@ -421,10 +421,11 @@ gdk_window_new (GdkWindow     *parent,
                        TCI_SRCCODEPAGE);
 
   titlelen = strlen (title);
-  wctitle = g_new (wchar_t, titlelen);
+  wctitle = g_new (wchar_t, titlelen + 1);
   mbtitle = g_new (char, 3*titlelen + 1);
   wlen = gdk_nmbstowchar_ts (wctitle, title, titlelen, titlelen);
-  WideCharToMultiByte (GetACP (), 0, wctitle, wlen,
+  wctitle[wlen] = 0;
+  WideCharToMultiByte (GetACP (), 0, wctitle, -1,
                       mbtitle, 3*titlelen, NULL, NULL);
   
   private->drawable.xwindow =
@@ -439,16 +440,6 @@ gdk_window_new (GdkWindow     *parent,
                    gdk_ProgInstance,
                    NULL);
 
-  g_free (mbtitle);
-  g_free (wctitle);
-
-  if (private->drawable.xwindow == NULL)
-    {
-      g_warning ("gdk_window_create: CreateWindowEx failed");
-      g_free (private);
-      return NULL;
-    }
-
   GDK_NOTE (MISC,
            g_print ("gdk_window_create: %s %s %dx%d@+%d+%d %#x = %#x\n"
                     "...locale %#x codepage %d\n",
@@ -457,13 +448,23 @@ gdk_window_new (GdkWindow     *parent,
                       (private->drawable.window_type == GDK_WINDOW_DIALOG ? "DIALOG" :
                        (private->drawable.window_type == GDK_WINDOW_TEMP ? "TEMP" :
                         "???")))),
-                    title,
+                    mbtitle,
                     width, height, (x == CW_USEDEFAULT ? -9999 : x), y, 
                     xparent,
                     private->drawable.xwindow,
                     private->input_locale,
                     private->charset_info.ciACP));
 
+  g_free (mbtitle);
+  g_free (wctitle);
+
+  if (private->drawable.xwindow == NULL)
+    {
+      g_warning ("gdk_window_create: CreateWindowEx failed");
+      g_free (private);
+      return NULL;
+    }
+
   gdk_window_ref (window);
   gdk_xid_table_insert (&private->drawable.xwindow, window);
 
@@ -1413,10 +1414,11 @@ gdk_window_set_title (GdkWindow   *window,
        * to the system codepage.
        */
       titlelen = strlen (title);
-      wcstr = g_new (wchar_t, titlelen);
+      wcstr = g_new (wchar_t, titlelen + 1);
       mbstr = g_new (char, 3*titlelen + 1);
       wlen = gdk_nmbstowchar_ts (wcstr, title, titlelen, titlelen);
-      WideCharToMultiByte (GetACP (), 0, wcstr, wlen,
+      wcstr[wlen] = 0;
+      WideCharToMultiByte (GetACP (), 0, wcstr, -1,
                           mbstr, 3*titlelen, NULL, NULL);
 
       if (!SetWindowText (GDK_DRAWABLE_XID (window), mbstr))
index e067af15c672fafd52992502aae7d8ab761e8a60..69c4648aaa9e8b7eace5a4f650ed09ac0a78e079 100644 (file)
@@ -40,7 +40,6 @@ gdk_OBJECTS = \
        gdk.o           \
        gdkcc.o         \
        gdkcolor.o      \
-       gdkcompat.o     \
        gdkcursor.o     \
        gdkdnd.o        \
        gdkdraw.o       \
index ec26079ea0aac332e265c480be0a04d6b337728b..e14cb100d46c3828dcbb637dee502cf15bd5b106 100644 (file)
@@ -15,11 +15,11 @@ WTKIT = ..\..\..\wtkit126
 !IFNDEF DEBUG
 # Full optimization:
 OPTIMIZE = -Ox -MD
-LINKDEBUG =
+LINKDEBUG = /nodefaultlib:libc.lib
 !ELSE
 # Debugging:
 OPTIMIZE = -Zi -MDd
-LINKDEBUG = /debug
+LINKDEBUG = /defaultlib:libcd.lib /debug
 !ENDIF
 
 # cl -? describes the options
@@ -47,7 +47,6 @@ gdk_OBJECTS = \
        gdk.obj         \
        gdkcc.obj       \
        gdkcolor.obj    \
-       gdkcompat.obj   \
        gdkcursor.obj   \
        gdkdnd.obj      \
        gdkdraw.obj     \
index 39517ae6ceba07ee920ace3c1245a14183556b71..f390693f347c4376b14b195da3908b34781a3c58 100644 (file)
@@ -468,7 +468,7 @@ gtk_rc_init (void)
   gint n_locale_suffixes = 0;
   gint i, j;
 #ifdef G_OS_WIN32
-  char *locale = gwin_getlocale ();
+  char *locale = g_win32_getlocale ();
 #else
 #ifdef HAVE_LC_MESSAGES
   char *locale = setlocale (LC_MESSAGES, NULL);